JavaScript类克隆的最佳方式

7

我有一个以传统方式声明的类,即:

function MyClass() {
}

MyClass.prototype = {
};

现在我想创建该类的一个副本(而不是该类创建的实例的副本),但更改一些原型方法。换句话说,我想制作一个带有一些增强功能的类副本...我需要使用继承吗?还是只需要循环并为原始原型和新原型分配引用即可?


你正在使用任何JavaScript库吗? - Robert Koritnik
1
MyClass 是一个函数而不是一个类。 - Gumbo
3
在JavaScript中实际上没有什么区别,只是你看待它的方式不同。 - vbence
听起来像是继承的完美候选人。也许你只需要稍微重构一下你的想法——也许不是一个超类型和一个子类型,而是有一个(可能是抽象的)超类型共享所有通用方法,和两个子类型,每个子类型实现各自的变化。如果你需要从一个子类型调用另一个子类型的方法,那么这个方法可能应该在父类型中。 - davin
3个回答

10

我会使用普通继承。试试这个:

var MyClass = function(){};
MyClass.prototype = {
  foo: function(){ alert('foo') },
  bar: function(){ alert('bar') }
};

var MySubClass = function(){};
MySubClass.prototype = new MyClass();
MySubClass.prototype.bar = function(){ alert('otherbar') };

var my = new MyClass();
var mysub = new MySubClass();
my.foo(); // foo
my.bar(); // bar
mysub.foo(); // foo
mysub.bar(); // otherbar

4
两年零两个月后,我想问的是如何克隆具有输入参数的构造函数? - Cihad Turhan

4
组合继承(有时也称为伪经典继承)结合了原型链和构造函数借用的优点,以获得最佳效果。
function SuperType(name){
    this.name = name;
    this.colors = ['red', 'blue', 'green'];
}

SuperType.prototype.sayName = function(){
    alert(this.name);
};

function SubType(name, age){          
    //inherit properties
    SuperType.call(this, name);
    this.age = age;
}

//inherit methods
SubType.prototype = new SuperType();

-1

仅仅克隆你的类并不是一种合乎逻辑的做法,类意味着共享特征,如果你只是想克隆类,那么这甚至不是一种合乎逻辑的方式,相反,你应该使用实例化对象来代替。你应该使用继承来创建现有类的子类。阅读关于继承的完整文章,请访问

https://developer.mozilla.org/en/JavaScript/Guide/Inheritance_Revisited


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接