JavaScript对象子类

时间:2009-07-30 03:45:29

标签: javascript object subclass

我想创建继承自超类A的子类B. 我的代码在这里:

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未定义。

4 个答案:

答案 0 :(得分:17)

在尝试访问其原型之前,必须先定义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"

答案 1 :(得分:7)

B.prototype = new A;
function B(){
    A.call(this);
    this.y = 2;
}

应该是

function B(){
    A.call(this);
    this.y = 2;
}
B.prototype = new A;

答案 2 :(得分:5)

Lynda.com建议您接下来将构造函数重新分配给B,如下所示。

function B() {
   A.call(this);
   this.y = 2;
}

B.prototype = new A;
B.prototype.constructor = B;

答案 3 :(得分:1)

在标准类派生中,几乎普遍存在从新创建的基类实例派生的错误(B.prototype = new A)。基类构造函数至少执行不必要的代码,并且在最坏的情况下可能会崩溃而没有输入参数,这些参数不应仅仅为了推导而人为创建。此外,基类实例的实例函数成为派生类原型的一部分,这只适用于纯粹的运气。

让我们说清楚!如果从基类构造函数(B.prototype = new A)创建的基类实例继承,则实际上并不是直接从基类继承!您已在继承链中创建了一个中介,即基类实例!哎哟!!!!这是低效的,因为在继承链中寻找继承的属性值有一个额外的深度。每次犯这个错误都会累积这个深度。

那么正确的方法是什么。而不是B.prototype = new 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 = new A你应该写 B.prototype = 09年的protoProxy(A);