JavaScript对象子类(JavaScript object sub-class)

2019-07-31 03:03发布

我想创建子类,其从超一流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是不确定的。

Answer 1:

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


Answer 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;


Answer 3:

Lynda.com建议,你下次重新分配的构造函数B,如下所示。

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

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


Answer 4:

在标准的类派生,有来自新创建的基类实例(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);



文章来源: JavaScript object sub-class