【问题标题】:How to avoid creating an instance of a base class when using prototype inheritance in JavaScript在 JavaScript 中使用原型继承时如何避免创建基类的实例
【发布时间】:2014-09-08 02:01:59
【问题描述】:

在 Javascript 中使用原型继承时,我们必须在某些时候创建基类的实例,以便将其原型插入调用链中。例如,如果我有一个 A 类和一个从 A. 继承的 B 类,它看起来像这样:

function A() {}

function B() {}

B.prototype = new A();

这很烦人,因为我还不想创建 A,这可能会产生负面影响。我怎样才能避免这种情况?

【问题讨论】:

  • “……这会产生负面影响”,比如?
  • 你为什么不想创建A?您对使用 Object 字面量有疑问吗?
  • @PHPglue——你不能用字面量做原型继承,你必须使用构造函数或Object.create来分配给对象的[[Prototype]](在ES6草案和非-中忽略setPrototypeOf标准__proto__ 属性)。
  • 我不创建 A 因为它与创建派生类无关。您强制使用哪种语言创建实例来创建派生类?
  • 看来 Object.create 解决了我遇到的问题。它不知道。

标签: javascript oop constructor prototypal-inheritance


【解决方案1】:

我创建了两个函数来避免这些副作用:

function constructor(func) {
    function deco() {
        if(arguments.callee.caller && arguments.callee.caller === setParent) {
            return;
        }
        return func.apply(this, arguments);
    }
    return deco;
}

function setParent(construcFunc, base) {
    construcFunc.prototype = new base();     
    construcFunc.prototype.constructor = construcFunc;   
}

现在我可以定义我的类了:

var A = constructor(function() {});
var B = constructor(function() {});
setParent(B, A);

这里的constructor 是一个装饰器函数。它的目的是在通过来自setParent 的调用创建对象时什么都不做,从而避免可能发生的副作用。完成。

【讨论】:

【解决方案2】:

似乎Object.create,由你们中的一些人提议,就是这样做的。 Object.create() - JavaScript | MDN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多