假设我具有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(); };
有没有比这更好的解决方案了?
最佳答案
如果将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();
};
另请参见Classical inheritance with
Object.create
。关于c# - JavaScript中的通用返回类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23507556/