如何在JavaScript中克隆构造函数?
我有一个构造函数如何在JavaScript中克隆构造函数?,javascript,Javascript,我有一个构造函数Monkey(): 我想创建另一个名为Human()的构造函数,其中包含一个额外的属性cars,该属性将存储此人拥有的汽车数量以及Monkey拥有的所有属性(如name和age) 我不想在新的Human内容中重复所有的Monkey内容。是否可以克隆Monkey并使用prototype扩展属性?我已经尝试了此代码,我想这正是您想要的: function Human(name,age,cars){ Monkey.call(this,name,age); this.ca
Monkey()
:
我想创建另一个名为Human()
的构造函数,其中包含一个额外的属性cars
,该属性将存储此人拥有的汽车数量以及Monkey
拥有的所有属性(如name
和age
)
我不想在新的
Human
内容中重复所有的Monkey
内容。是否可以克隆Monkey
并使用prototype扩展属性?我已经尝试了此代码,我想这正是您想要的:
function Human(name,age,cars){
Monkey.call(this,name,age);
this.cars = cars;
}
这样,Human
构造函数将Monkey
构造函数作为普通函数调用,但将其命名空间设置为新的Human
对象。因此,在这种情况下,Monkey
构造函数中的this
关键字引用类Human
的对象,而不是Monkey。
此外,使用此代码,条件new Human()instanceof Human
返回true
,因为我并没有返回Monkey
的新实例,只是使用它的构造函数
而且,你可以像你说的那样“克隆”原型。只要这样做:
Human.prototype = Monkey.prototype;
编辑
正如@Bergi amd所建议的,克隆原型的最佳方法是使用,如下所示:
Human.prototype = Object.create(Monkey.prototype, {constructor:{value:Human}});
功能性风格/寄生性继承的简单开始:
function Human(name, age, cars) {
var that = new Monkey(name, age);
that.cars = cars;
return that;
}
如道格拉斯·克罗克福德所述
我写这个答案只是为了补充其他答案,除非您完全了解使用非标准
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
function Monkey(name, age) {
this.name = name;
this.age = age;
}
function Human(name, age, cars) {
this.__proto__ = new Monkey(name, age);
this.cars = cars;
}
console.log(new Human(1, 2, 3));
另请参见
是,但这样构造函数返回的对象类型为Monkey
,而不是Human
(请参见new Human()instanceof Human;
)@MarkLinus“type”?听起来你是在把古典思想带入一个更具活力的空间。依赖于instanceof
这样的东西,只会将您绑定到JavaScript中未对齐的范例。我只是说,尽管它是正确的,但您的解决方案并不能解决我描述的这个问题:new Human()
将不是类Human
as的实例expected@MarkLinus你在回答一个没有被问到的问题时带有偏见。像这样使用instanceof
是编程实现的一种形式。这两个对象都提供相同的功能,这个解决方案一开始就说它倾向于功能
方向,这意味着该对象与数据比类型系统有更多的共同点。我知道不是,但这可能是未来的问题,因为我不知道OP将如何使用这个类Human.prototype=Object.create(Monkey.prototype,{constructor:{value:Human})
会更好,否则所有的猴子都是人类的实例
和(新人类)。构造函数
会是猴子。@Bergi谢谢,我不知道。我会更新答案事实上,你应该同时做这两件事-然后你会得到原型的方法和构造函数的副作用。(或者是@Bergi所说的,但是如果不支持Object.create
,那么它就是Human.prototype=new Monkey();Human.prototype.constructor=Human;
)@minitech:我确信它是为了两者兼而有之。顺便说一句,你不应该使用Human.prototype=newmonkey
-你会得到构造函数的副作用,而这些副作用并不适用。有更好的方法来填充@Bergi:是的,我只是想在这个特殊的情况下,因为构造函数除了设置属性之外什么都不做。实际上我认为它根本不应该被使用-继承很奇怪:-)@Bergi你是说人类从猴子继承的事实?我同意:)不过说真的,原型结构并没有让我觉得不直观。每个人都是从自己的猴子那里继承的。没有人是人类的实例,而且人类的原型是无用的。@Bergi这是有道理的;但在某种程度上,这也是由于问题本身的性质。
function Monkey(name, age) {
this.name = name;
this.age = age;
}
function Human(name, age, cars) {
this.__proto__ = new Monkey(name, age);
this.cars = cars;
}
console.log(new Human(1, 2, 3));