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