4 回答

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

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

TA貢獻(xiàn)1712條經(jīng)驗 獲得超3個贊
用簡單的英語,你將一個班級擴展到另一個班級。原型只能是一個對象,所以你將WeatherWidget
原型設(shè)置為一個新的實例Widget
。如果刪除了new
關(guān)鍵字,則將原型設(shè)置為文字構(gòu)造函數(shù),該函數(shù)不執(zhí)行任何操作。
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中,如果在對象上找不到鍵,它會檢查您從中擴展它的父對象。因此,您可以動態(tài)更改父對象上的項目,如下所示:
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.
請注意,這一切都發(fā)生在實例化期間,這意味著您不能在創(chuàng)建對象后切換原型:
var?foo?=?{name?:?'bob'};var?bar?=?{nachos?:?'cheese'};foo.prototype?=?bar;foo.nachos;//?undefined
但是,所有現(xiàn)代瀏覽器都附帶這種更新的__proto__
方法,允許您這樣做:
var?foo?=?{name?:?'bob'};var?bar?=?{nachos?:?'cheese'};foo.__proto__?=?bar;foo.nachos//?"cheese"
添加回答
舉報