2013-11-19 3 views
1

Я новичок в OOJS, поэтому, пожалуйста, несите меня на этом. Я пытаюсь получить настройки вроде следующего:JavaScript - прототип наследования

Item 
    name = "no name" 
    description = "no description" 
    someVar = "no var" 

Section 
    name = "Section A" 
    //Rest are inherited 
    deleted = false 

До сих пор у меня есть:

function Item() {} 
function Section() {} 
$.extend(Item.prototype, { 
    name: "no name", 
    description: "no description" 
} 
Section.prototype = Item.prototype; 
$.extend(this.Section.prototype, { 
    description: "A section", 
    swung: true, 
    swing: function() { 
     this.swung = false; 
     return this; 
    } 
}); 

$.extend(this.Item.prototype, { 
    "date": "x" 
}); 

$.extend(this.Section.prototype, { 
    "someVar": "someValue" 
}); 

Если я создаю новый раздел, я получаю:

Section { 
    name: "no name", 
    description: "A section", 
    swung: true, 
    swing: function, 
    date: "x", 
    someVar: "someValue" 
} 

Если я создайте новый товар, я получаю:

Item { 
    name: "no name", 
    description: "A section", 
    swung: true, 
    swing: function, 
    date: "x", 
    someVar: "someValue" 
} 

Очевидно, они оба одинаковы, и причина в том, что прототип является одним и тем же экземпляром. То, что я пытаюсь достичь, состоит в том, что все функции, которые наследуют свойство Item, выбирают свойства, когда они будут добавлены, а любые изменения значения свойства прототипа Item не влияют на свойство в разделе, если оно было предварительно переопределено. Любые изменения прототипа раздела должны не влиять на прототип элемента (как это, очевидно, произошло выше), так как будут свойства, относящиеся к разделу. Кто-нибудь знает какой-либо способ достичь этого?

Если я не проясняюсь, скажите, пожалуйста, вместо того, чтобы опрокидывать меня :). Заранее спасибо.

+2

использования Section.prototype = new Item() вместо их объединения. Таким образом, прототип раздела является собственным объектом, который может быть изменен без влияния на Item.prototype. – dandavis

+0

Кроме того, по соображениям производительности вам действительно не нужно использовать метод расширения jQuery. Например, вы можете просто сделать «Item.prototype.date =« x »;' – sbking

+0

@dandavis: omg, который сделал это! Такое маленькое изменение! Благодарю. @Cuberto: Я знаю, что не обязательно использовать jQuery для таких вещей - просто не нужно писать «Item.prototype». ... '. Я просто экспериментирую сейчас - когда дело доходит до применения его на работе, я напишу его до конца. – ClarkeyBoy

ответ

3

При наследовании в JS вы не назначаете один прототип другому. Вместо этого, вы назначаете экземпляр родительского прототипа ребенка:

Section.prototype = new Item(); 

Вы можете проверить упрощенную версию кода (без необходимости JQuery, который просто излишне усложняет все): http://jsfiddle.net/p3h5C/

+0

Спасибо Джастину, особенно за объяснение перед кодом - действительно просто понять вот так :). – ClarkeyBoy

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