Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ООП: как создавать наследника от встроенных объектов? (https://javascript.ru/forum/misc/2684-oop-kak-sozdavat-naslednika-ot-vstroennykh-obektov.html)

Dicot 02.02.2009 09:37

Вот только хотел залезть на форум с таким же вопросом и наткнулся на это обсуждение. Жаль, что непонятки с наследованием от Array так и не разрешены :(

Может все дело в самом свойстве length?
Честно говоря мне не понятно, как оно обновляется, т.е. как отслеживается сам момент добавления к массиву нового элемента.
Есть ли в языке механизм, позволяющий отследить это событие или это реализовано на уровне недоступном программисту?

А в остальном наследование от прототипа вроде работает корректно?

x-yuri 02.02.2009 09:44

Цитата:

Может все дело в самом свойстве length?
других причин не вижу. Но если в ff его можно вручную изменить при наследовнии, то в ie - нельзя

Цитата:

Честно говоря мне не понятно, как оно обновляется, т.е. как отслеживается сам момент добавления к массиву нового элемента.
автоматически (http://javascript.ru/ecma/part15#a-15.4.5)

Цитата:

Есть ли в языке механизм, позволяющий отследить это событие или это реализовано на уровне недоступном программисту?
не знаю, я приводил альтернативные варианты решения проблемы. Почему необходимо именно наследование?

Dicot 02.02.2009 11:26

function myObj(){
...
};
myObj.prototype = Array.prototype;

var x = new myObj();

x[0] = 5;

Разве в этом случае x получает свой метод [[Put]](P, V) не от объекта Array.prototype? Если да, то свойство length должно обновляться нормально?

Кстати, я так привязался к наследованию потому, что в этом и состоит цель - разобраться с наследованием :)

x-yuri 02.02.2009 11:35

Цитата:

Разве в этом случае x получает свой метод [[Put]](P, V) не от объекта Array.prototype? Если да, то свойство length должно обновляться нормально?
[[Put]] - свойство экземпляра Array... кстати, надо будет одну штуку попробовать

Цитата:

Кстати, я так привязался к наследованию потому, что в этом и состоит цель - разобраться с наследованием
а уже читал http://javascript.ru/tutorial/object/inheritance ?

x-yuri 02.02.2009 11:43

[[Put]] - это специальный метод, и вряд ли он в каком-нибудь браузере по цепочке прототипов ищется
function myObj() {}
myObj.prototype = new Array();
var x = new myObj();
x.__proto__[0] = 5;
alert(x.__proto__.length);

вот такая штука, например, работает в ff, но есть же еще ie, у которого я не знаю как к прототипу обратится. Но у него даже вручную length изменить нельзя

Dicot 02.02.2009 12:04

Читал, но там все больше свойства к прототипу цепляют...
А хочется свой класс сделать

Вариант с __proto__ не нравится.
Этак можно просто сделать

x.arr = []
x.arr[0] = 5;
alert(x.arr.length)
....

Но какое ж это наследование.

Может проблема в подходе. В JavaScript просто плохо применимы методы ооп из типизированных языков, а нужно действовать по другому?

x-yuri 02.02.2009 12:23

фактически, в javascript нету классов, а наследование построено на прототипах. Классы можно только эмулировать и по-разному, а можно не эмулировать
Прототипное программирование — стиль объектно-ориентированного программирования (может не очень достоверный источник, но вот http://ru.wikipedia.org/wiki/Про...ова ие)

еще есть такие варианты
http://ejohn.org/blog/simple-javascript-inheritance/
http://dean.edwards.name/weblog/2006/03/base/
http://javascript.crockford.com/inheritance.html
http://javascript.crockford.com/prototypal.html

Dicot 02.02.2009 17:07

Спасибо за ссылочки
Теперь понятно откуда ноги растут :)


Часовой пояс GMT +3, время: 07:19.