關(guān)于new操作符磕道,我們最常看到的代碼像這樣:
var obj = new Base();
new操作符具體干了什么呢?我們可以用代碼模擬它的行為行冰。
var obj = (function () {
var temp = {};
temp.__proto__ = Base.prototype;
var result = Base.call(temp);
return typeof result === 'object'? result : temp;
})();
- 創(chuàng)建了一個(gè)空對(duì)象obj溺蕉。
- 將這個(gè)空對(duì)象的__proto__成員指向了Base函數(shù)對(duì)象prototype成員對(duì)象贯卦。
- 將Base函數(shù)對(duì)象的this指針替換成obj,然后再調(diào)用Base函數(shù)焙贷。
- 判斷result的類型,返回結(jié)果贿堰。
下面通過一些例子來理解
在沒有return的情況下
function A() {
this.a = 'a';
}
var a = new A();
console.log(a); //A {a: "a"}
console.log(a.__proto__.constructor); //? A() {this.a = 'a';}
function B() {
var b = 'b'
}
var b = new B();
console.log(b); //B {}
console.log(b.__proto__.constructor); //? B() {var b = 'b'}
由以上的結(jié)果可以分析出
- 實(shí)例的constructo都指向構(gòu)造函數(shù)辙芍。
在有return的情況下
function C() {
return 'c';
}
var c = new C();
console.log(c); //C {}
console.log(c.__proto__.constructor);//? C() {return 'c';}
function D() {
return {
d: 'd'
};
}
var d = new D();
console.log(d); //{d: "d"}
console.log(d.__proto__.constructor);//? Object() { [native code] }
function E() {
return function () {
this.e = 'e';
}
}
var e = new E();
console.log(e); //? () {this.e = 'e';}
console.log(e.__proto__.constructor);//? Function() { [native code] }
function F() {
this.f = 'f';
return {
f: 'f-1'
}
}
var f = new F();
console.log(f); //{f: "f-1"}
console.log(f.__proto__.constructor);//? Object() { [native code] }
function G() {
return gv;
}
var g = new G();
console.log(gv === g); //true
由以上的結(jié)果可以分析出
- 正如編輯器webstorm的提示語(Primitive value returned from constructor will be lost when called with 'new')所說的一樣, 如果return的是一個(gè)基本類型的值羹与,那么值會(huì)消失故硅,new出來的實(shí)例就是一個(gè)空對(duì)象,實(shí)例的constructor指向構(gòu)造函數(shù)纵搁。
- 如果return的是一個(gè)引用類型的值吃衅,那么new出來的實(shí)例就是就是return的值的本身,實(shí)例的constructor指向值的constructor腾誉。