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

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

以下代码的作用如下:

WeatherWidget.prototype = new Widget;

哪里Widget是构造函数,我想用新函数扩展Widget'类' WeatherWidget

什么是new关键字在那里做什么,如果被遗漏会发生什么?


胡子哥哥
浏览 597回答 4
4回答

慕码人2483693

根据一些奇怪的Javascript规则,new Widget实际上调用构造函数而不是返回对构造函数的引用。这个问题实际上回答了var a = new Widget()和之间的区别var a = Widget()。简单来说,new关键字告诉Javascript Widget在一组不同于常规函数调用的规则下调用函数。脱离我的头脑,我记得的是:创建了一个全新的对象Widget可以使用this关键字来引用该对象。如果Widget不返回任何内容,则将创建此新对象。此对象将继承一些其他属性,这些属性将指示它是Widget用于跟踪属性链的。如果没有new关键字,则会调用窗口小部件如果在严格模式下,this将设置为undefined.否则,this将引用全局对象。(window由浏览器调用。)如果函数没有返回任何内容,则undefined返回。参考: new关键字

Smart猫小萌

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);

交互式爱情

用简单的英语,你将一个班级扩展到另一个班级。原型只能是一个对象,所以你将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"
打开App,查看更多内容
随时随地看视频慕课网APP