【问题标题】:How inherits from lazy instantiation object?如何从惰性实例化对象继承?
【发布时间】:2011-09-09 07:00:37
【问题描述】:

在我的 JavaScript 代码中,我有一个惰性实例化对象 AAA。我想创建新对象 BBB 并从 AAA 继承。

它是怎么做的?

【问题讨论】:

  • 您必须提供更多信息和代码示例。帮助我们为您提供帮助!
  • 如果没有更具体的信息,您正在尝试执行的操作以及您正在使用延迟实例化执行的操作的代码示例,我们将无能为力。否则问题将被关闭,因为它目前无法回答。

标签: javascript oop inheritance


【解决方案1】:

标准的javascript继承可以通过原型实现

BBB.prototype = new AAA();

但是,如果父方法被覆盖,您将无法通过这种方式访问​​它们。出于这个原因,我使用静态属性超类,例如

function AAA() {}
AAA.prototype = {
foo: function() {return 'foo';}
}

function BBB() {}
BBB.superclass = AAA.prototype;
BBB.prototype = {
foo: function() { return BBB.superclass.foo() + "bar";}
}
b = new BBB();
b.foo() //returns foobar

【讨论】:

  • 无论您选择以上两种方式中的哪一种,都可以通过AAA.prototype获得父母的方法。
  • 是的,但很难维护。如果我出于某种原因更改父级,我必须对调用父级的所有函数进行更改,而静态属性更改只进行一次。
  • 你仍然可以使用BBB.superclass = AAA.prototype;,即使你有BBB.prototype = new AAA();。请注意,您的第二种方式实际上是没有继承。如果AAA.prototype 实现了一个未被覆盖的方法怎么办?你不能做b.bar()。或者也许我误解了你。
  • 是的,您对继承的看法是正确的。在上面的代码中,我错过了将 AAA.prototype 复制到 BBB。我的错。我的意思是分享一种访问父方法的方法。
【解决方案2】:

我喜欢作弊,这将创建继承自公共o 的对象。我冒昧地重命名了您在问题中提出的变量。

var o = {
    happy: true,
    fun: true,
    time: true
}

var AAA = {
    happy: false
};
AAA.__proto__ = o;

console.log( 'happy', AAA.happy );
console.log( 'fun', AAA.fun );

【讨论】:

  • __proto__ 很可能在不久的将来变得不可写。
  • 是的,这就是我称之为作弊的原因。否则,您需要使用newObject.create 的糟糕语法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多