2015-05-19 2 views
1
function A(){ 
    // sort of like this 
    // this.arr = []; 
} 

function B(){ 
    // not here though 
    // this.arr = []; 
} 

B.prototype = new A(); // all B instances would share this prototypes attributes 

// I want all B instances to have an arr attributes (array) 
// of their own but I want the parent class to define it 

var b1 = new B(); 
var b2 = new B(); 

b1.arr.push(1); 
b2.arr.push(2); 

b1.arr.length === 1; // should be true 
b2.arr.length === 1; // should be true 

Я хочу написать код в A, который будет определять в arr переменную для каждого экземпляра класса ребенка B таким образом, что arr новый объект для каждого B экземпляра. Я мог бы это сделать, установив this.arr = [] в конструктор B, но можно ли это сделать с кодом, написанным на A?Атрибуты атрибутов наследования Javascript?

ответ

2

Существует большая проблема в вашей идее наследования в Javascript. В javascript у вас действительно есть объекты, и это в значительной степени. Конструктор - это метод, который вызывается с new и создает новый объект.

Эта часть кода на самом деле не является right, поскольку вы создаете прототип, используя объект, созданный из A ... Тем не менее, вы не используете прототип A. Поскольку наследование для одного слова не существует, вам придется реализовать что-то, что вызовет все конструкторы, которые необходимы для создания объекта B.

B.prototype = new A(); 

Вы должны использовать этот метод вместо:

B.prototype = Object.create(A.prototype) 

В этом случае, вы будете иметь все прототипы А в Б ... Но вы все равно придется вызвать конструктор A если необходимо.

function A() { 
    this.arr = [] 
} 

function B() { 
    A.call(this) 
} 

Используя более сложную библиотеку, вы могли бы в конечном итоге с наследованием и нечто похожее на super в питона. Если вы действительно это понимаете, вы также можете создать структуру, которая будет автоматически вызывать каждый конструктор каждого субпрототипа.

0

может быть, это то, что вы ищете:

B.prototype = Object.create(A.prototype); 

С Object.create() вы можете создать объект с определенным прототипом, и я считаю, что это то, что вы пытаетесь сделать.

+0

если вы сделаете вызов конструктора он работает отлично – maioman

0

Один из способов я могу думать о том, что для работы:

function A(){ 
    this.arr = []; 
} 

function B(){ 
    A.call(this); 
} 
B.prototype = new A(); 
+1

Это не нужно вызывать 'новый A()'. Поскольку вы вызываете конструктор A в конструкторе B, он будет выглядеть так, как если бы вы дважды вызвали конструктор. В прототипе B вам действительно нужно только скопировать прототип 'A' с' Object.create'. –

+0

hmm .. спасибо для объяснения. – roxxypoxxy

Смежные вопросы