设置正确的JS继承所需的'constructor'属性?

时间:2012-11-24 13:44:49

标签: javascript inheritance properties constructor

  

可能重复:
  Why is it necessary to set the prototype constructor?

我正在努力理解在构建层次结构时将javascript对象的'constructor'属性设置为子类的必要性。我发现下面的代码在不改变构造函数属性的情况下完成了预期的操作,但在几乎所有引用中我都发现了构造函数的显式设置。我错过了什么吗? (我也没有在ECMAScript规范中找到任何明确的使用方法。)

A = function() {
    this.value = "a";

    this.A = function() {
        window.alert( this.value + " instanceof A : " + ( this instanceof A ) );
    }
}


B = function() {
    this.value = "b";

    this.B = function() {
        window.alert( this.value + " instanceof B : " + ( this instanceof B ) );
    }
}

B.prototype = new A();

test = function() {
    var b = new B();
    b.A();
    b.B();
}

1 个答案:

答案 0 :(得分:1)

首先,正确的JS继承意味着将方法放在原型中:

var A = function() {
    this.value = "a";
};

A.prototype.A  = function() {
        window.alert( this.value + " instanceof A : " + ( this instanceof A ) );
};

var B = function() {
    this.value = "b";
};

其次,在建立原型链时不要运行构造函数:

B.prototype = Object.create( A.prototype );

每当您重新分配整个.prototype时,您都会完全覆盖该对象。所以构造函数 属性需求(如果要使用)重新分配:

B.prototype.constructor = B;

B.prototype.B = function() {
    window.alert( this.value + " instanceof B : " + ( this instanceof B ) );
};
旧版浏览器不支持

Object.create,但您可以执行以下操作:

Object.create = Object.create || function( proto ) {
     if( proto == null ) {
         return {};
     }
     function f(){}
     f.prototype = proto;
     return new f();
};