我想创建子类,其从超一流A.我的代码在这里继承:
function A(){
this.x = 1;
}
B.prototype = new A;
function B(){
A.call(this);
this.y = 2;
}
b = new B;
Console.log(b.x + " " + b.y );
当运行它,它表明B是不确定的。
我想创建子类,其从超一流A.我的代码在这里继承:
function A(){
this.x = 1;
}
B.prototype = new A;
function B(){
A.call(this);
this.y = 2;
}
b = new B;
Console.log(b.x + " " + b.y );
当运行它,它表明B是不确定的。
试图访问其原型之前,必须定义在B的构造函数:
function A(){
this.x = 1;
}
function B(){
A.call(this);
this.y = 2;
}
B.prototype = new A;
b = new B;
console.log(b.x + " " + b.y ); // outputs "1 2"
B.prototype = new A;
function B(){
A.call(this);
this.y = 2;
}
应该
function B(){
A.call(this);
this.y = 2;
}
B.prototype = new A;
Lynda.com建议,你下次重新分配的构造函数B,如下所示。
function B() {
A.call(this);
this.y = 2;
}
B.prototype = new A;
B.prototype.constructor = B;
在标准的类派生,有来自新创建的基类实例(B.prototype =新A)获得的几乎普遍的错误。 在最起码的基类构造函数执行不必要的代码,并在最坏的情况而没有不应该只是为了推导起见,将人为制造的输入参数可能会崩溃。 此外,基类实例的实例的功能变得派生类的原型,其中仅侥幸是适当的组成部分。
让我们清楚! 如果从基类构造函数创建一个基类实例继承(B.prototype =新A)你实际上并没有直接从基类继承! 你已经继承链中创造了一个中介,即基类实例! 哎哟!!!! 这是低效的,因为在继承链中寻求继承属性值的额外深度。 这个深度积累每次你犯这样的错误的时间。
那么,什么是正确的做法。 相反B.prototype =新A的你应该写B.prototype =的Object.create(A.prototype)。 这可能不会在09中09已经面世但仍有很
protoProxy = function(myClass)
{
function foo(){};
foo.prototype = myClass.prototype;
return new foo();
}
为的Object.create的替代品。 相反B.prototype =新的A,你应该在09写B.prototype = protoProxy(A);