4 回答

TA貢獻1860條經驗 獲得超9個贊
根據一些奇怪的Javascript規則,new Widget
實際上調用構造函數而不是返回對構造函數的引用。這個問題實際上回答了var a = new Widget()
和之間的區別var a = Widget()
。
簡單來說,new
關鍵字告訴Javascript?Widget
在一組不同于常規函數調用的規則下調用函數。脫離我的頭腦,我記得的是:
創建了一個全新的對象
Widget
可以使用this
關鍵字來引用該對象。如果
Widget
不返回任何內容,則將創建此新對象。此對象將繼承一些其他屬性,這些屬性將指示它是
Widget
用于跟蹤屬性鏈的。
如果沒有new
關鍵字,則會調用窗口小部件
如果在嚴格模式下,
this
將設置為undefined.
否則,
this
將引用全局對象。(window
由瀏覽器調用。)如果函數沒有返回任何內容,則
undefined
返回。
參考:?new
關鍵字

TA貢獻1911條經驗 獲得超7個贊
WeatherWidget.prototype?=?new?Widget;
確實創建了一個Widget
構造函數的新實例,并將其用作WeatherWidget
原型對象。使用new
關鍵字創建新對象,設置它的繼承鏈Widget.prototype
,并在其上應用構造函數(您可以在其中設置單個屬性的'n'方法,或創建私有范圍的變量)。
沒有new
關鍵字,它將是Widget
對prototype
屬性的函數賦值- 這沒有任何意義。如果你要添加可選括號(ie?Widget()
),它會正常調用函數,但不能作為新實例的構造函數,而是將全局對象作為上下文。另請參閱關鍵字的參考this
。
請注意,您不應該真正使用此代碼。如上所述,它通過調用構造函數創建一個新實例。但目的只是創建一個從s原型對象繼承的空對象Widget
,而不是實例化某些東西(這可能會造成一些傷害,具體取決于代碼)。相反,你應該使用Object.create
(或其流行的墊片):
WeatherWidget.prototype?=?Object.create(Widget.prototype);

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"
添加回答
舉報