复制原型需要一个新对象? JavaScript的

时间:2012-03-28 04:16:59

标签: javascript

所以我正在查看“Eloquent Javascript”中的一些代码,它说要导致继承,你可能会编写一个函数:

function clone(object) {
    function OneShotConstructor() {}
    OneShotConstructor.prototype = object;
    return new OneShotConstructor();
}

并且如果已经定义了类Terrarium,则会这样调用它:

function LifeLikeTerrarium(plan) {
    Terrarium.call(this, plan);
}
LifeLikeTerrarium.prototype = clone(Terrarium.prototype);
LifeLikeTerrarium.prototype.constructor;

所以我的问题是为什么我们需要创建OneShotConstructor才能复制其原型。为什么我们不能写出类似的东西:

LifeLikeTerrarium.prototype = new Terrarium();

这会造成任何问题,是不正确的javascript?

2 个答案:

答案 0 :(得分:2)

见Crockford的原型继承:

http://javascript.crockford.com/prototypal.html

除了设置原型之外,还需要调用new关键字,该关键字将对象的内部[[prototype]]属性设置为构造函数的外部原型。 然后执行构造函数,只要提到这个就使用新对象。

这里有一个很好的解释:

What is the 'new' keyword in JavaScript?

在这里:

http://joost.zeekat.nl/constructors-considered-mildly-confusing.html

答案 1 :(得分:1)

  

所以我的问题是为什么我们需要在中创建OneShotConstructor   为了复制它的原型。为什么我们不能写   类似的东西:

LifeLikeTerrarium.prototype = new Terrarium();
     

这会造成任何问题,是不正确的javascript?

因为调用新的Terrarium()除了克隆对象外,还会调用它的构造函数,后果不明。如果以环形方式执行此操作,则无需调用构造函数即可克隆对象。