当前位置: 首页 > 面试题库 >

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

齐望
2023-03-14
问题内容

以下代码是做什么的:

WeatherWidget.prototype = new Widget;

Widget构造函数在哪里,我想用新函数扩展Widget的“类” WeatherWidget

什么是 new 关键词在那里做,如果它被省略了,会发生什么?


问题答案:

WeatherWidget.prototype = new Widget;

new关键字调用Widget构造函数,返回值分配给prototype属性。(如果省略newWidget除非添加了参数列表,否则将不会调用()。但是,以Widget这种方式调用可能是不可能的。如果它不是严格的模式代码并且实现是,则肯定有可能
破坏全局名称空间。 符合ECMAScript版本5.x,因为this在构造函数中它将引用ECMAScript的全局对象。)

这样,您的WeatherWidget实例将全部从 同一个 Widget实例继承。原型链将为:

[new WeatherWidget()] → [new Widget()] → [Widget.prototype] → …

这可能很有用,但是大多数时候您都不希望发生这种情况。除非您希望所有WeatherWidget实例 在它们之间共享 从该实例(仅 通过
该实例)继承的 属性值
,否则不要在此进行操作。另一个问题是您需要以这种方式调用父构造函数,这可能不允许像您一样在没有参数的情况下调用它,或者无法正确初始化。它与模拟类(例如从Java)继承的继承毫无关系。Widget
__Widget.prototype

function Dummy () {}
Dummy.prototype = Widget.prototype;
WeatherWidget.prototype = new Dummy();
WeatherWidget.prototype.constructor = WeatherWidget;

constructor原型属性应该是固定的为好,这样你的WeatherWidget情况下,w将有w.constructor === WeatherWidget预期,而不是w.constructor === Widget。但是,请注意,此后是可枚举的。

这样一来,WeatherWidget情况将通过继承原型链的属性,但不会在它们之间共享的属性值,因为他们继承Widget.prototype通过Dummy它没有自己的属性:

[new WeatherWidget()] → [new Dummy()] → [Widget.prototype] → …

在ECMAScript Ed的实现中。5及更高版本,您可以并且应该使用

WeatherWidget.prototype = Object.create(Widget.prototype, {
  constructor: {value: WeatherWidget}
});

代替。这具有额外的优点,即所得的constructor属性不可写,不可枚举或不可配置。

仅当从中显式调用父构造函数时,才会调用WeatherWidget,例如

function WeatherWidget (…)
{
  Widget.apply(this, arguments);
}

另请参见Function.prototype.extend()我的JSX:object.js中如何将其概括化。使用该代码,它将变成

WeatherWidget.extend(Widget);

My Function.prototype.extend()带有一个可选的第二个参数,您可以使用它轻松地扩展WeatherWidget实例的原型:

WeatherWidget.extend(Widget, {
  foo: 42,
  bar: "baz"
});

相当于

WeatherWidget.extend(Widget);
WeatherWidget.prototype.foo = 42;
WeatherWidget.prototype.bar = "baz";

但是,您仍然需要在子构造函数中显式调用父构造函数。该部分不能合理地自动化。但是我向实例Function.prototype.extend()添加了一个_super属性,Function这使它变得更容易:

function WeatherWidget (…)
{
  WeatherWidget._super.apply(this, arguments);
}

其他人也实现了类似的扩展。



 类似资料:
  • 问题内容: 在JavaScript中的关键字可能会相当混乱首次遇到它的时候,人们往往会认为JavaScript是不是面向对象的编程语言。 它是什么? 它解决什么问题? 什么时候合适,什么时候不合适? 问题答案: 它做五件事: 它创建一个新对象。这个对象的类型就是 object 。 它将这个新对象的内部不可访问的 [[prototype]] (即 proto )属性设置为构造函数的外部可访问 原型

  • 问题内容: 在另一个问题中,用户指出该关键字使用很危险,并提出了不使用该对象创建对象的解决方案。我不相信这是真的,主要是因为我使用了Prototype,Scriptaculous和其他出色的JavaScript库,并且每个人都使用了关键字。 尽管如此,昨天我还是在DouglasCrockford在YUI剧院观看了一次演讲,他说的一模一样,他不再在代码中使用关键字(JavaScript上的Crock

  • 本文向大家介绍谈谈JavaScript的New关键字,包括了谈谈JavaScript的New关键字的使用技巧和注意事项,需要的朋友参考一下 原型和闭包算是JavaScript中最常见,最难以理解,最容易被当做问题的两个部分,当然还有它们的延伸,如作用域链,继承等等吧,我最近也是各种看,各种翻,记录点自己的心得,写写总会让自己的理解更深一些。(跟标题的关系不大啦,就感慨句,每次总感觉自己懂了,再翻还

  • 问题内容: 我正在网上关注Java教程,尝试学习该语言,并且它在使用数组的两种语义之间反弹。 和: 该教程从未真正提到过为什么它会在两者之间来回切换,所以我对该主题进行了一些搜索。我目前的理解是,操作员正在创建“ longs数组”类型的对象。我 不 明白的是为什么我要那个,那有什么后果? 是否存在某些特定于“数组”的方法,除非它是“数组对象”,否则这些方法对数组不起作用? 有什么我 不能 用普通数

  • 问题内容: 什么时候需要在Java中使用关键字。我知道您在创建这样的对象实例时应该使用它: 有时在代码中,我注意到没有使用它,我感到困惑。在这一行代码中: 为什么不这样创建AssetManager的实例: 然后将其设置为等于getAssests()? 什么时候应该使用? 谢谢! 问题答案: 首次明确创建对象时,请使用new关键字。然后,不需要使用新的getter方法获取对象,因为该对象已存在于内存

  • 问题内容: Java中的原生关键字是什么? 问题答案: 述关键字被应用于方法,以指示该方法是在本机代码使用JNI(Java本地接口)来实现。