JavaScript原型继承和构造函数

时间:2012-01-06 12:41:17

标签: javascript inheritance prototype

考虑下面的例子:

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.

1 个答案:

答案 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方法中。