2015-10-18 3 views
2

решаемыеJS Прототип цепь

Назначения прототипов на самый день была перезапись моих предыдущих заявлений. Спасибо Гуффа за быстрый ответ.


Я просматривал и добрый нахожу хороший ответ, моды, если это док, извините.

К коду .. У меня есть три функции: одна, две и три соответственно. Я бы хотел, чтобы три наследовали от двух и двух от одного. Прототип из трех человек должен полностью вернуться к одному, что и делает. Я могу вызывать методы от одного, пока я в трех экземплярах. Но я не могу вызывать методы из двух.

Вот пример.

function one() { 
    this.version = 1; 
}; 

one.prototype.one = function() { 
    return 'I live on the one class'; 
}; 

function two() { // extends one 
    this.version = 2; 
}; 

two.prototype.two = function() { 
    return 'I live on the two class'; 
}; 

function three() { // extends two 
    this.version = 3; 
}; 

three.prototype.three = function() { 
    return 'I live on the three class'; 
}; 

two.prototype = Object.create(one.prototype); 
three.prototype = Object.create(two.prototype); 

var x = new three(); 

x.one // -> 'I live on the one class!' 
x.two // -> undefined 
x.three // -> undefined 

Когда я вызываю x.one, я получаю ожидаемый вывод 'i live on one class'. Но x.two не определено. Когда я смотрю на цепочку прототипов, вообще нет методов/свойств в цепочке. Доступен только прототип из одного.

Мой мозг плачет.

EDIT Я еще не пробовал x.three, но он также не определен. Возможно, способ, которым я наследую, переписывать прототипы вместо совместного использования? Хотя, если это была проблема, я чувствую, что у меня будет доступ к двум, а не к одному. Я не уверен, почему у меня есть доступ к корневому классу, но между ними нет ни одного экземпляра, который был вызван. Это как если бы три были просто ссылкой на один.

ответ

2

Вы заменяете прототип two и three после добавления методов к ним. Цепочка прототипов отлично работает, но методы two и three не находятся в прототипах после их замены.

Заменить прототипы перед добавлением методов к ним:

function one() { 
 
    this.version = 1; 
 
}; 
 

 
one.prototype.one = function() { 
 
    return 'I live on the one class'; 
 
}; 
 

 
function two() { // extends one 
 
    this.version = 2; 
 
}; 
 

 
two.prototype = Object.create(one.prototype); 
 

 
two.prototype.two = function() { 
 
    return 'I live on the two class'; 
 
}; 
 

 
function three() { // extends two 
 
    this.version = 3; 
 
}; 
 

 
three.prototype = Object.create(two.prototype); 
 

 
three.prototype.three = function() { 
 
    return 'I live on the three class'; 
 
}; 
 

 
var x = new three(); 
 

 
// Show values in snippet 
 
document.write(x.one() + '<br>'); // -> 'I live on the one class' 
 
document.write(x.two() + '<br>'); // -> 'I live on the two class'

+0

За любовь бога, пожалуйста, не используйте document.write() в примерах. Это именно то, что делает w3school так много. Мы в основном избавились от него, не вернем его: P –

+0

Ах, да, это имеет смысл. Я по существу стирал прототипы, прежде чем у них была возможность увидеть дневной свет. И один из них был доступен, потому что я никогда не переписывал его прототип. Отлично, спасибо. –

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