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