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"
添加回答
举报