考虑下面的例子:
function A(obj) {
}
B.prototype = new A;
B.prototype.constructor = B;
function B(obj) {
A.call(this, obj);
}
其中B应该从A继承原型。这段代码是否正确?为什么在解析脚本时调用函数A一次,而没有声明A或B的任何实例?是因为这条线?
B.prototype = new A;
如果是这样,B如何在定义中不调用函数A的情况下继承A.
答案 0 :(得分:4)
如果使用Object.create
,则可以避免再次调用A.B.prototype = Object.create(A.prototype)
Object.create创建一个新对象,该对象具有给定参数作为其原型(实际原型,而不是“原型”属性)。它不存在于旧浏览器中(IE< 8,FF< 4),但是如果你愿意,你可以(为了我们的目的)创建你自己的版本。基本的想法是精确地创建一个A
的版本,什么都不做(因此可以被称为没有不良的副作用)
if(!Object.create){
Object.create = function(proto){
var F = function(){};
F.prototype = proto;
return new F(); //BTW, always use parenthesis when calling new. It looks better.
}
}
你可以做的另一件事是永远不要把逻辑放在构造函数中,而是将它放在一个必须在之后调用的单独的init
方法中。