使用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)()