20

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

4

2 回答 2

24

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

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

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

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

于 2012-07-15T01:01:48.877 回答
0

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

let functionFactory = function(){

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

    }
    o.prototype.foo = 'bar'

    return o

}

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

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

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

于 2021-08-04T09:50:09.600 回答