假设我具有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/

10-09 05:40