为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

在Derived.prototype = new Base使用'new'关键字的原因是什么以下代码的作用如下:WeatherWidget.prototype = new Widget;哪里Widget是构造函数,我想用新函数扩展Widget'类' WeatherWidget。什么是new关键字在那里做什么,如果被遗漏会发生什么?
查看完整描述

4 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

根据一些奇怪的Javascript规则,new Widget实际上调用构造函数而不是返回对构造函数的引用。这个问题实际上回答了var a = new Widget()和之间的区别var a = Widget()

简单来说,new关键字告诉Javascript Widget在一组不同于常规函数调用的规则下调用函数。脱离我的头脑,我记得的是:

  1. 创建了一个全新的对象

  2. Widget可以使用this关键字来引用该对象。

  3. 如果Widget不返回任何内容,则将创建此新对象。

  4. 此对象将继承一些其他属性,这些属性将指示它是Widget用于跟踪属性链的。

如果没有new关键字,则会调用窗口小部件

  1. 如果在严格模式下,this将设置为undefined.

  2. 否则,this将引用全局对象。(window由浏览器调用。)

  3. 如果函数没有返回任何内容,则undefined返回。

参考: new关键字


查看完整回答
反对 回复 2019-05-29
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

WeatherWidget.prototype = new Widget;

确实创建了一个Widget构造函数的新实例,并将其用作WeatherWidget原型对象。使用new关键字创建新对象,设置它的继承链Widget.prototype,并在其上应用构造函数(您可以在其中设置单个属性的'n'方法,或创建私有范围的变量)。

没有new关键字,它将是Widgetprototype属性的函数赋值- 这没有任何意义。如果你要添加可选括号(ie Widget()),它会正常调用函数,但不能作为新实例的构造函数,而是将全局对象作为上下文。另请参阅关键字的参考this

请注意,您不应该真正使用此代码。如上所述,它通过调用构造函数创建一个新实例。但目的只是创建一个从s原型对象继承的对象Widget,而不是实例化某些东西(这可能会造成一些伤害,具体取决于代码)。相反,你应该使用Object.create(或其流行的垫片):

WeatherWidget.prototype = Object.create(Widget.prototype);


查看完整回答
反对 回复 2019-05-29
?
交互式爱情

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"


查看完整回答
反对 回复 2019-05-29
  • 4 回答
  • 0 关注
  • 596 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信