對(duì)于prototype和new的疑問
我將
fNOP.prototype?=??this.prototype; fBound.prototype?=?new?fNOP();
替換為
fBound.prototype?=?fNOP.prototype?=??this.prototype;
使用 func() 或者 new func()結(jié)果都和沒有改變,所以我不是太明白這里。
我將
fNOP.prototype?=??this.prototype; fBound.prototype?=?new?fNOP();
替換為
fBound.prototype?=?fNOP.prototype?=??this.prototype;
使用 func() 或者 new func()結(jié)果都和沒有改變,所以我不是太明白這里。
2015-05-30
舉報(bào)
2015-06-05
自問自答好開森哇
2017-02-19
我來補(bǔ)充一下,不知道對(duì)不對(duì):
我糾結(jié)的地方主要是為什么要“中轉(zhuǎn)”(fNOP.prototype?=??this.prototype;)?
根據(jù)知乎有關(guān)繼承文章里的解釋,簡(jiǎn)單來說:a.prototype = b.prototype?這種方式會(huì)導(dǎo)致一方修改值另一方也會(huì)跟著改變,不能算是繼承,所以需要使用new XXX()的方式繼承fBound(func)。
但是因?yàn)閠his沒有辦法直接使用 a.prototype = new b() 的方式進(jìn)行繼承操作。
所以需要進(jìn)行“中轉(zhuǎn)”操作,也就是“fNOP.prototype = this.prototype”,中轉(zhuǎn)后就可以使用new XXX()的方式了。
其實(shí)在ES5中相當(dāng)于fBound.prototype = Object.create(this.prototype);,這樣在ES5中對(duì)于this.prototype就不用“中轉(zhuǎn)”操作了。
2016-04-19
個(gè)人認(rèn)為,
fNOP.prototype?=?this.prototype;
fBound.prototype?=?new?fNOP();
主要為了實(shí)現(xiàn)bind后返回的函數(shù)對(duì)原函數(shù)的原型繼承。
例子:
如果上述代碼不加上,那么:
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();//報(bào)錯(cuò),sayhi is not a function
但是如果加上了就bind后return回來的函數(shù)就擁有了foo的原型。
其實(shí)光從這點(diǎn)講,樓主的代碼也可以改為:
fBound.prototype?=??this.prototype;
然后運(yùn)行上述代碼后,t.sayhi()是執(zhí)行成功的。這里存在的問題是我改變了func的prototype,foo的prototype也會(huì)跟著變,所以不推薦。
最后說個(gè)題外話,在bind函數(shù)內(nèi)部,fBound內(nèi)部判斷this instanceof fNop,個(gè)人覺得不清晰(雖然是正確的),改成 this instanceof fBound ,這樣才更清晰,因?yàn)閚ew函數(shù)生成的實(shí)例按理說應(yīng)該指向它的構(gòu)造函數(shù)。
2015-06-01
我明白這里的區(qū)別是什么了,方法一會(huì)拷貝一個(gè)fNOP的prototype給fBound,由于是拷貝所以修改fBound的prototype不會(huì)影響到fNOP的prototype。
其實(shí)這兩種方法是等價(jià)的:
和