對于prototype和new的疑問
我將
fNOP.prototype?=??this.prototype; fBound.prototype?=?new?fNOP();
替換為
fBound.prototype?=?fNOP.prototype?=??this.prototype;
使用 func() 或者 new func()結果都和沒有改變,所以我不是太明白這里。
我將
fNOP.prototype?=??this.prototype; fBound.prototype?=?new?fNOP();
替換為
fBound.prototype?=?fNOP.prototype?=??this.prototype;
使用 func() 或者 new func()結果都和沒有改變,所以我不是太明白這里。
2015-05-30
舉報
2015-06-05
自問自答好開森哇
2017-02-19
我來補充一下,不知道對不對:
我糾結的地方主要是為什么要“中轉”(fNOP.prototype?=??this.prototype;)?
根據知乎有關繼承文章里的解釋,簡單來說:a.prototype = b.prototype?這種方式會導致一方修改值另一方也會跟著改變,不能算是繼承,所以需要使用new XXX()的方式繼承fBound(func)。
但是因為this沒有辦法直接使用 a.prototype = new b() 的方式進行繼承操作。
所以需要進行“中轉”操作,也就是“fNOP.prototype = this.prototype”,中轉后就可以使用new XXX()的方式了。
其實在ES5中相當于fBound.prototype = Object.create(this.prototype);,這樣在ES5中對于this.prototype就不用“中轉”操作了。
2016-04-19
個人認為,
fNOP.prototype?=?this.prototype;
fBound.prototype?=?new?fNOP();
主要為了實現bind后返回的函數對原函數的原型繼承。
例子:
如果上述代碼不加上,那么:
function foo(b){
this.c = 100;
return this.a+b;
}
foo.prototype.sayhi = function(){
alert('hi');
}
var func = foo.bind({a:1},20);
var t1 = func();
var t = new func({a:10},300);
alert(func.prototype===foo.prototype);//false
alert(t.c);
t.sayhi();//報錯,sayhi is not a function
但是如果加上了就bind后return回來的函數就擁有了foo的原型。
其實光從這點講,樓主的代碼也可以改為:
fBound.prototype?=??this.prototype;
然后運行上述代碼后,t.sayhi()是執行成功的。這里存在的問題是我改變了func的prototype,foo的prototype也會跟著變,所以不推薦。
最后說個題外話,在bind函數內部,fBound內部判斷this instanceof fNop,個人覺得不清晰(雖然是正確的),改成 this instanceof fBound ,這樣才更清晰,因為new函數生成的實例按理說應該指向它的構造函數。
2015-06-01
我明白這里的區別是什么了,方法一會拷貝一個fNOP的prototype給fBound,由于是拷貝所以修改fBound的prototype不會影響到fNOP的prototype。
其實這兩種方法是等價的:
和