2012-04-12 5 views
0

Я создал this jsfiddle, чтобы показать проблему, с которой сталкиваюсь.
Предлагаю взглянуть на него, прежде чем читать.типы наследования в классах цепочки

Хорошо, теперь мы готовы.
Как вы видели, существует целая цепочка наследования: LeafDevice ->EndDevice ->SubNetDevice ->NetDevice ->Device. Когда я создаю новый LeafDevice, цепочка выполняется (т.е. выполняется в правильном порядке), но устанавливаются только атрибуты от LeafDevice и EndDevice (посмотрите на консоль).
Когда я запускаю метод обновления, он, кажется, перескакивает на класс каждые 2 ... Я имею в виду, вы видите на выходе, что javascript, кажется, не запускает методы EndDevice.update()10 и NetDevice.update() ... Только атрибуты от , SubNetDevice и LeafDevice обновлены/добавлены (опять же, посмотрите на консоль) ...
Это сводит меня с ума, так как я не могу понять, что я делаю неправильно!
Что я пытаюсь сделать, это создать экземпляр LeafDevice объекта, который следует по цепочке наследования я определен так, что в конце она имеет все определенные атрибуты (myDeviceAttr, myNetDeviceAttr, mySubNetDeviceAttr, myEndDeviceAttr, myLeafDeviceAttr).
Можете ли вы дать некоторые идеи о том, что здесь происходит, пожалуйста?
Спасибо вам большое!

ответ

1

Это код используется для вызова обновление EndDevice & ожидая update EndDevice придумать

EndDevice.prototype.update.call(this, pDevice); 

Но здесь

EndDevice.prototype = new SubNetDevice; 

Вы явно присвоить объект SubNetDevice в качестве прототипа EndDevice в

Итак, EndDevice.prototype.update эквивалентен

var a = new SubNetDevice(); 
a.update() 

Следовательно, Ни в коем случае Вы можете увидеть update EndDevice в журнале

Причина не одно и то же для Net устройства тоже.

Попробуйте http://ejohn.org/blog/simple-javascript-inheritance/

удлинять функции в указанной выше ссылке должно решить ур проблема

исправить вышеупомянутую скрипку в изменении LeafDevice

EndDevice.prototype.update.call(this, pDevice); 

Для

LeafDevice.prototype.update.call(this, pDevice); 

Это изменение требуется, потому что вы expec Ted позвонить LeafDevice в -> EndDevice-х -> метод Update, который доступен @LeafDevice.prototype.update, но не здесь EndDevice.prototype который EndDevice в -> SubNetDevice в -> метод Update

То же самое касается всех ваших классов

Также Вы уже пропустили .call в

SubNetDevice(this, pDevice); 

Это должно исправить свои свойства вопрос

http://jsfiddle.net/v6NsB/8/ это ваш обновленный скрипку

+0

Я думаю, что сценарий не очень хорош, так как в моих тестах он не позволяет использовать методы с одним или несколькими параметрами. Если у вас есть доказательства обратного, пожалуйста, покажите рабочий пример, и я буду использовать его. В любом случае, я был бы рад не использовать этот сценарий и использовать естественное поведение javascript (я знаю, что это можно сделать)! Я не собираюсь принимать этот ответ, потому что он не ясно показывает, как решить проблему (пока вы не разработаете немного, извините) – andreapier

+0

@andreapier Я исправил ваш скрипт на скрипке, взгляните на него. Я не понимаю, что вы действительно пытаетесь сделать. На ваш вопрос не хватает правильного объяснения. Вчера я ответил: «Это сводит меня с ума, так как я не могу понять, что я делаю неправильно». Теперь я обновил ваш скрипт для работы, как вы ожидали. – Tamil

+0

Ну, теперь метод обновления работает так, как ожидалось, но конструктор этого не делает. Если вы посмотрите глубже, вы увидите, что объект LeafDevice имеет только myEndDeviceAttr и myLeafDeviceAttr ... у него нет mySubNetDeviceAttr, myNetDeviceAttr и myDeviceAttr. @Tamil – andreapier

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