假设我使用C#进行通用克隆实现:
public class Parent<T> where T : Parent, new()
{
public T Clone()
{
return new T();
}
}
public class Child : Parent<Child>{ }
这样,使用new Child().Clone()
将返回类型为Child
的对象,而不是父对象。
是否有与javascript等效的解决方案?
我能想到的最多就是使用这样的函数指针:
var parent = function(){
};
parent.prototype.clonePointer = function(){ return new parent(); };
parent.prototype.clone = function(){
return this.clonePointer();
};
var child = function(){
};
child.prototype = Object.create(parent.prototype);
child.clonePointer = function(){ return new child(); };
有没有比这更好的解决方案?
答案 0 :(得分:2)
如果您将constructor
设置回其原始值,即Child
,则和正确建立继承:
function Child() {
Parent.call(this);
}
Child.prototype = Object.create(Parent.prototype, {
constructor: {value: Child}
});
// or, instead of passing a property descriptor
Child.prototype.constructor = Child;
// (but this makes `constructor` enumerable)
克隆方法可以像
一样简单Parent.prototype.clone = function() {
return new this.constructor();
};