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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Derived.prototype = new Base使用'new'關鍵字的原因是什么

在Derived.prototype = new Base使用'new'關鍵字的原因是什么

在Derived.prototype = new Base使用'new'關鍵字的原因是什么以下代碼的作用如下:WeatherWidget.prototype = new Widget;哪里Widget是構造函數,我想用新函數擴展Widget'類' WeatherWidget。什么是new關鍵字在那里做什么,如果被遺漏會發生什么?
查看完整描述

4 回答

?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

根據一些奇怪的Javascript規則,new Widget實際上調用構造函數而不是返回對構造函數的引用。這個問題實際上回答了var a = new Widget()和之間的區別var a = Widget()

簡單來說,new關鍵字告訴Javascript?Widget在一組不同于常規函數調用的規則下調用函數。脫離我的頭腦,我記得的是:

  1. 創建了一個全新的對象

  2. Widget可以使用this關鍵字來引用該對象。

  3. 如果Widget不返回任何內容,則將創建此新對象。

  4. 此對象將繼承一些其他屬性,這些屬性將指示它是Widget用于跟蹤屬性鏈的。

如果沒有new關鍵字,則會調用窗口小部件

  1. 如果在嚴格模式下,this將設置為undefined.

  2. 否則,this將引用全局對象。(window由瀏覽器調用。)

  3. 如果函數沒有返回任何內容,則undefined返回。

參考:?new關鍵字


查看完整回答
反對 回復 2019-05-29
?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

WeatherWidget.prototype?=?new?Widget;

確實創建了一個Widget構造函數的新實例,并將其用作WeatherWidget原型對象。使用new關鍵字創建新對象,設置它的繼承鏈Widget.prototype,并在其上應用構造函數(您可以在其中設置單個屬性的'n'方法,或創建私有范圍的變量)。

沒有new關鍵字,它將是Widgetprototype屬性的函數賦值- 這沒有任何意義。如果你要添加可選括號(ie?Widget()),它會正常調用函數,但不能作為新實例的構造函數,而是將全局對象作為上下文。另請參閱關鍵字的參考this

請注意,您不應該真正使用此代碼。如上所述,它通過調用構造函數創建一個新實例。但目的只是創建一個從s原型對象繼承的對象Widget,而不是實例化某些東西(這可能會造成一些傷害,具體取決于代碼)。相反,你應該使用Object.create(或其流行的墊片):

WeatherWidget.prototype?=?Object.create(Widget.prototype);


查看完整回答
反對 回復 2019-05-29
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

用簡單的英語,你將一個班級擴展到另一個班級。原型只能是一個對象,所以你將WeatherWidget原型設置為一個新的實例Widget。如果刪除了new關鍵字,則將原型設置為文字構造函數,該函數不執行任何操作。

var?Appendages?=?function(){
??this.legs?=?2};var?Features?=?function()?{
???this.ears?=?4;
???this.eyes?=?1;}//?Extend?Features?class?with?Appendages?class.Features.prototype?=?new?Appendages;var?sara?=?new?Features();sara.legs;
???//?Returns?2.

理解原型可以是任何對象,這樣的東西也可以工作:

var?appendages?=?{
??legs?:?2};var?Features?=?function()?{
???this.ears?=?4;
???this.eyes?=?1;}//?Extend?Features?class?with?Appendages?class.Features.prototype?=?appendages;var?sara?=?new?Features();sara.legs;
???//?Returns?2.

在JavaScript中,如果在對象上找不到鍵,它會檢查您從中擴展它的父對象。因此,您可以動態更改父對象上的項目,如下所示:

var?appendages?=?{
??legs?:?2};var?Features?=?function()?{
???this.ears?=?4;
???this.eyes?=?1;}//?Extend?Features?class?with?Appendages?class.Features.prototype?=?appendages;var?sara?=?new?Features();sara.legs;
???//?Returns?2.appendages.hair?=?true;sara.hair;//?Returns?true.

請注意,這一切都發生在實例化期間,這意味著您不能在創建對象后切換原型:

var?foo?=?{name?:?'bob'};var?bar?=?{nachos?:?'cheese'};foo.prototype?=?bar;foo.nachos;//?undefined

但是,所有現代瀏覽器都附帶這種更新的__proto__方法,允許您這樣做:

var?foo?=?{name?:?'bob'};var?bar?=?{nachos?:?'cheese'};foo.__proto__?=?bar;foo.nachos//?"cheese"


查看完整回答
反對 回復 2019-05-29
  • 4 回答
  • 0 關注
  • 643 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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