2015-09-22 4 views
0

Я читал о прототипном наследовании JavaScript и свойстве прототипа, и я начал делать скрипку, чтобы лучше понять концепции. Но мне нужна помощь, чтобы понять, почему мой пример не работает, как я думал.Наследование прототипа JavaScript для отображения родительского имени объекта

В следующем примере я пытаюсь создать иерархию, где, когда вы создаете объект, он сообщает вам имя родительского объекта. Однако мои журналы всегда возвращают «объект».

В одной статье объясняется, что цепочка прототипов работает так, что если свойство не найдено на объекте, проверяется прототип родителя, и он продолжает расти до «объекта», а если не найден, возвращается неопределенный.

Вот скрипку идти вместе: http://jsfiddle.net/hqozqd0m/

Object.prototype.cname = 'object'; 
 

 
function plant() { 
 
    function parentname() { return this.cname; } 
 
    return { 
 
     parentname:parentname 
 
    } 
 
} 
 
plant.prototype.cname = 'plant'; 
 

 
function tomato() { 
 
    function parentname() { return this.cname; } 
 
    return { 
 
     parentname:parentname 
 
    } 
 
} 
 
tomato.prototype = new plant(); // <-- settings it to plant as parent 
 

 
var p = new plant(); 
 
var t = new tomato(); 
 

 
console.log(p.parentname()); //object 
 
console.log(t.parentname()); //object


обновленный код - тот же результат

Object.prototype.cname = 'object'; 

function plant() { 
    this.sayparentname = function() { console.log(cname); }; 
} 
plant.prototype.cname = 'plant'; 

function tomato() { 
    this.sayparentname = function() { console.log(cname); }; 
} 
tomato.prototype = new plant(); 

var p = new plant(); 
var t = new tomato(); 

p.sayparentname(); 
t.sayparentname(); 
+0

Вы неправильно смешивая два разных стиля. Тот, у кого есть новый, и тот, где возвращаются объекты literal из функций, вызванных без new. –

ответ

2

Обычно функция конструктора будет изменять объект, который new Создайте s, с такими заявлениями, как this.foo = bar, и ничего не возвращать. Тогда результатом выражения new является объект.

Однако, если функция возвращает объект, этот объект заменит тот, который был создан new; поэтому, когда вы используете new plant(), вы просто получаете экземпляр обычного экземпляра.

Чтобы исправить код, нужно просто сделать это следующим образом:

function Plant() { 
    function parentName() { return this.cname; } 

    this.parentName = parentName; 
} 
+0

Подождите, что ... я просто перечитаю это. так как же вы создаете новый завод? –

+0

см. Мой обновленный код. На этот раз я ничего не верну от конструкторов. тот же результат –

+3

@AbdulAhmad: вам не хватает этого перед cname. –