js中new一個對象的過程


使用new關鍵字調用函數(new ClassA())的具體步驟:

1. 創建空對象;
  var obj = {};

2. 設置新對象的constructor屬性為構造函數的名稱,設置新對象的__proto__屬性指向構造函數的prototype對象;
  obj.__proto__ = ClassA.prototype;

3. 使用新對象調用函數,函數中的this被指向新實例對象:
  ClassA.call(obj);  //{}.構造函數();          

4. 將初始化完畢的新對象地址,保存到等號左邊的變量中

注意:若構造函數中返回this或返回值是基本類型(number、string、boolean、null、undefined)的值,則返回新實例對象;若返回值是引用類型的值,則實際返回值為這個引用類型。

var foo = "bar";
function test () {
  this.foo = "foo";
}
new test();                    //test中的this指新對象,並未改變全局的foo屬性
console.log(this.foo);             // "bar"
console.log(new test().foo);  // "foo";

 優先級問題:

優先級由高到低:小括號(xxx) ---> 屬性訪問.  ---> new foo() ----> foo()

function getName(){
    console.log(1)
}
function Foo() {
    this.getName = function () {
        console.log(2); 
    };
    return this;
}
Foo.getName = function () {
    console.log(3);
};
//先從.屬性訪問符號開始往前面找一個最近的對象,同時注意new Foo()優先於Foo();
var a=new Foo.getName();//3;===new (Foo.getName)();返回Foo.getName類型的實例 var b=new Foo().getName();//2;===(new Foo()).getName();返回undefined var c=new new Foo().getName();//2;===new (new Foo().getName)();返回Foo.getName類型的實例 new Date().getTime();//===((new Date()).getTime)() (new Date).getTime(); new Date.getTime();//Uncaught TypeError: Date(...).getTime is not a function;===new (Date.getTime)()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM