如何在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));