Подкласс JavaScript-объекта - PullRequest
5 голосов
/ 30 июля 2009

Я хочу создать подкласс 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 не определено.

Ответы [ 4 ]

17 голосов
/ 30 июля 2009

Вы должны определить функцию конструктора 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"
7 голосов
/ 30 июля 2009
B.prototype = new A;
function B(){
    A.call(this);
    this.y = 2;
}

должно быть

function B(){
    A.call(this);
    this.y = 2;
}
B.prototype = new A;
5 голосов
/ 16 апреля 2011

Lynda.com рекомендует вам переназначить конструктор на B следующим образом.

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

B.prototype = new A;
B.prototype.constructor = B;
1 голос
/ 25 ноября 2013

При выводе стандартного класса существует почти универсальная ошибка при выводе из вновь созданного экземпляра базового класса (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 = protoProxy (A) в 09;

...