0

可能重复:
为什么要设置原型构造函数?

我很难理解在构建层次结构时将 javascript 对象的“构造函数”属性设置为子类的必要性。我发现下面的代码在不更改构造函数属性的情况下完成了预期的操作,但在我发现的关于该主题的几乎所有参考资料中,构造函数都是明确设置的。我错过了什么吗?(我也没有在 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();
}
4

1 回答 1

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();
};
于 2012-11-24T13:55:23.723 回答