以下代码是做什么的:
WeatherWidget.prototype = new Widget;
Widget
构造函数在哪里,我想用新函数扩展Widget的“类” WeatherWidget
。
什么是 new
关键词在那里做,如果它被省略了,会发生什么?
WeatherWidget.prototype = new Widget;
该new
关键字调用Widget
构造函数,返回值分配给prototype
属性。(如果省略new
,Widget
除非添加了参数列表,否则将不会调用()
。但是,以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本地接口)来实现。