亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

對于prototype和new的疑問

我將

fNOP.prototype?=??this.prototype;
fBound.prototype?=?new?fNOP();

替換為

fBound.prototype?=?fNOP.prototype?=??this.prototype;

使用 func() 或者 new func()結果都和沒有改變,所以我不是太明白這里。

正在回答

4 回答

自問自答好開森哇

0 回復 有任何疑惑可以回復我~
#1

JFeng 提問者

=。= 標記一下免得忘了,老師我寫的對不對。
2015-08-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就不用“中轉”操作了。


1 回復 有任何疑惑可以回復我~

個人認為,

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函數生成的實例按理說應該指向它的構造函數。

0 回復 有任何疑惑可以回復我~
#1

慕粉3540272

請問一下,對于這里:fBound.prototype = this.prototype; 為什么說改變了func的prototype會影響到foo的prototype呢?
2016-07-01 回復 有任何疑惑可以回復我~
#2

熬夜對身體不好所以要通宵 回復 慕粉3540272

去了解下值類型和引用類型的區別吧
2019-04-30 回復 有任何疑惑可以回復我~

我明白這里的區別是什么了,方法一會拷貝一個fNOP的prototype給fBound,由于是拷貝所以修改fBound的prototype不會影響到fNOP的prototype。

其實這兩種方法是等價的:

fNOP.prototype?=?this.prototype;
fBound.prototype?=?new?fNOP();


fBound.prototype?=?Object.creat(this.prototype);


1 回復 有任何疑惑可以回復我~
#1

meow_meow

完美!
2016-03-10 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
JavaScript深入淺出
  • 參與學習       281094    人
  • 解答問題       1054    個

由淺入深學習JS語言特性,且解析JS常見誤區,從入門到掌握

進入課程

對于prototype和new的疑問

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號