我正在玩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找到任何东西。我不想实现错误的代码:)!
答案 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'
通过这种方式,您仍然可以获得共享原型等的好处,但可以创建一个新副本,然后您可以覆盖每个实例,而无需其他实例践踏您的更改。