【问题标题】:Copy prototype for inheritance?复制原型进行继承?
【发布时间】:2012-07-14 08:52:42
【问题描述】:

我在玩 JavaScript,特别是用类和诸如此类的东西模拟面向对象的编程。

我知道这种实现继承的方式

MyClass.prototype = new AnotherClass();

但我并不满意,我不喜欢我需要调用AnotherClass 的构造函数。所以我一直在玩,我想出了一些似乎可行的方法,基本上想要第二个意见。

function clone (obj)
{
    function CloneFactory () {}
    CloneFactory.prototype = obj;

    return new CloneFactory();
}

MyClass.prototype = clone(AnotherClass.prototype);

通过克隆原型,我们得到它的一个新副本并将其分配给MyClass 的原型,这样更改继承的属性就不会影响父原型的属性。像这样MyClass.prototype = AnotherClass.prototype

我进行了压力测试,这在某些情况下效率更高,即当父构造函数中有很多代码时,其他情况大致相同。另一个好处(或者至少我发现它是有益的)是它允许在某种程度上隐藏子类的信息。任何特权方法和成员都不会被继承。

我是否忽略了一些重大缺陷?

我不是 JavaScript 专家,实际上我对 JavaScript 还很陌生,所以我想对此发表第二意见,因为我似乎无法通过 Google 找到任何东西。我不想实现糟糕的代码:)!

【问题讨论】:

    标签: javascript inheritance


    【解决方案1】:

    几乎正是Object.create 所做的。您编写的函数是该方法的一个非常标准的“polyfill”。

    这是一种非常常见的抽象对象创建方式,更接近地反映了“真正的”原型继承。绝对是一种安全的做事方式。

    哦,这里是 Object.create 的 MDN 条目的链接,如果您有兴趣:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create/

    您会在底部注意到它们实际上包含 polyfill,这与您的代码几乎相同,除了一些安全检查和变量名称。

    【讨论】:

    • 谢谢!直到现在我才知道Object.create
    【解决方案2】:

    我遇到了这个问题,因为我自己正在寻找解决方案。我认为最好的解决方案是从工厂函数创建函数。

    let functionFactory = function(){
    
        let o = function(o, ...args){
    
        }
        o.prototype.foo = 'bar'
    
        return o
    
    }
    

    然后,要使用它,您只需:

    let myinstance = new functionFactory;
    myinstance.bar = 'bar'
    

    这样您仍然可以获得共享原型等的好处,但可以创建一个新副本,然后您可以覆盖每个实例,而无需其他实例踩踏您的更改。

    【讨论】:

      猜你喜欢
      • 2012-02-19
      • 2011-03-02
      • 2019-01-24
      • 2016-07-04
      • 2012-10-31
      • 2015-07-07
      • 2020-12-28
      • 2013-04-10
      相关资源
      最近更新 更多