复制原型继承?

时间:2012-07-15 00:49:17

标签: javascript inheritance

我正在玩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找到任何东西。我不想实现错误的代码:)!

2 个答案:

答案 0 :(得分:21)

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

这是以更接近“真实”原型继承的方式抽象对象创建的一种非常常见的方式。绝对是一种安全的做事方式。

哦,如果您有兴趣,可以点击Object.create的MDN条目链接:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create/

你会注意到它们实际上包含了polyfill,它与你的代码完全相同,除了一些安全检查和变量名称。

答案 1 :(得分:0)

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

let functionFactory = function(){

    let o = function(o, ...args){

    }
    o.prototype.foo = 'bar'

    return o

}

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

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

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