0

Я пытаюсь понять наследование/прототипы javascript.Попытка понять/изучить/использовать наследование в javascript с .prototype-свойством

Я сделал это:

function Foo(par){ 
    this.prop= par; 
    this.propTwo = par; 
} 
function Bar(par){ 
    this.p=par; 
} 
Bar.prototype = new Foo(); 

Если я:

var myBar = new Bar("value"); 

myBar.propTwo неопределен (я предполагаю, что это потому, что даже если я перезаписать прототип, я явно с помощью Bar «построить функция "< <, пожалуйста, исправьте меня, если я ошибаюсь в этом допущении.

если я хочу, чтобы это Bar inherit from Foo, как мне создать экземпляр Bar или переписать функции (ы) конструкций, чтобы получить propTwo, также определенный/назначенный при создании объекта myBar (обратите внимание, что тот же переданный аргумент присваивается обоим реквизитам)?

Я даже не уверен, что я делаю что-то «хорошее» здесь, поэтому, если я полностью ошибаюсь, это нормально сказать, если можно исправить, пожалуйста, не стесняйтесь в деталях.

Update: Я выбрал Ethan Brown's ответ, как правильно из-за 1 мин. разницы (ничего личного). Оба объяснения хорошо работают и используют два разных способа (на самом деле идея одна и та же, одна использует «применять» другой «вызов»).

Также Bergi's ссылки/комментарий он оказывается расширенный ответ/обоснование о том, почему не использовать этот подход:

What is the reason to use the 'new' keyword here?

Спасибо за ответы/материал.

+0

Возможный дубликат [Исправлено наследование javascript] (http: // stackoverflow.com/questions/10898786/correct-javascript-inheritance) – Bergi

+1

Этот код как есть даст опорную ошибку в конструкторе Bar: 'prop' не определено. Это опечатка? Должно ли это быть 'this.p = par;'? –

+1

и вы выполняете 'Foo()' без параметров..so 'this.prop' и' this.propTwo' будет просто неопределенным ... – fiddler

ответ

2

Если я правильно понимаю ваш вопрос, вы задаетесь вопросом, почему prop и propTwo не установлены в myBar, когда вы объявили Bar быть подклассом Foo.

Ответ заключается в том, что функция конструктора автоматически не вызывает конструктор своего прототипа. Я думаю, что вы, вероятно, хотите, это:

// parent class 
function Foo(par){ 
    this.prop = par; 
    this.propTwo = par; 
} 

// subclass 
function Bar(par){ 
    Foo.call(this, par); // invoke parent class constructor 
    this.p = par;   // custom construction 
} 
Bar.prototype = new Foo() 

Как Берги указывает в комментариях ниже, подклассов, установив прототип подкласса на новый экземпляр родительского класса, вероятно, что вы хотите: что делает все экземпляры подтипов наследовать от экземпляра родительского класса, а не прототипа родительского класса. Если вы хотите эмулировать классическое наследство, ваш лучший выбор для использования Object.create метод:

Bar.prototype = Object.create(Foo.prototype); 
Bar.prototype.constructor = Bar; 

Смотрите MDN documentation on Object.create для получения дополнительной информации. Вы также можете прочитать link Bergi mentioned и this SO question.

+0

Пожалуйста, прочитайте [почему бы не использовать 'new' для настройки прототипа] (http://stackoverflow.com/q/12592913/1048572) – Bergi

+0

Да, вы правы, спасибо, Берги. Я просто копировал код OPs без редакционной обработки, но я обновляю свой ответ. –

+1

Вы правы, я пробовал пример о «классическом наследовании», но в примере не показывалось/упоминалось об использовании apply/call, и я застрял там (до нескольких минут позже они упоминают только то, что вы ответили/отправили), образец просто показал что-то вроде того, что я опубликовал, и я действительно запутался, спасибо за объяснение и информацию, продолжит свой путь по js и функциональному наследованию :) – Allende

1

Вам нужно вызвать функцию Foo в «контексте» (или области) панели. Эффект подобен вызову Foo в качестве родительского конструктора.

function Foo(par){ 
     this.prop= par; 
     this.propTwo = par; 
    } 
function Bar(par){ 
     this.p=par; 
     Foo.apply(this,arguments); 
    } 
Bar.prototype = new Foo(); 

var myBar = new Bar("value"); 

console.log(myBar); 
+1

Пожалуйста, прочитайте [почему бы не использовать 'new' для настройки прототипа] (http://stackoverflow.com/q/12592913/1048572) – Bergi

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