Показать сообщение отдельно
  #1 (permalink)  
Старый 13.07.2013, 15:28
Новичок на форуме
Отправить личное сообщение для krantadan Посмотреть профиль Найти все сообщения от krantadan
 
Регистрация: 13.07.2013
Сообщений: 5

Почему методы массива находятся в прототипе, а не в конструкторе?
Приветствую)
Почему стандартные объекты в JavaScript (вроде строк или массивов) наследуют свои методы из прототипа, вместо того, чтобы задать их присваиваниями в своём конструкторе?

То есть почему в Array делается так:
function Array() {}
Array.prorotype = {
    push: function (...) {...},
    ...
};


Вместо того, чтобы сделать так:
function Array() {
    this.push = function (...) {...};
    ...
}


Ведь именно конструктор - место для задания полей будущего объекта, а прототип - это способ реализовать наследование. Я хочу сказать, что такая архитектура не типична, и если бы вам нужно было реализовать массивы в C++, то вы бы обошлись одним классом, а не двумя с наследованием.
Так что каждый раз при создании своих объектов приходится решать для себя дилемму: следовать этой странной яваскриптовой традиции или сделать "по-нормальному". Может быть я чего-то не понимаю, хочется понять причины такой вот яваскриптовой традиции.
У меня есть некоторые догадки на этот счёт, но мне бы хотелось узнать ваше мнение)
Вот мои мысли:

1) Расширение функциональности.
Чтобы можно было легко расширить функциональность всех строк.
Кроме того можно легко поменять прототип для всех новых объектов.
Это правда считается дурным тоном, нарушением инкапсуляции и вообще ведёт к конфликтам. Так что в нормальных классовых языках этому вообще нет аналога.

2) Производительность.
Немного ускоряется создание новых объектов, так как нет множества присваиваний в конструкторе. Однако также немного замедляется обращение к методам, так как приходится дольше их искать.

3) Красивая структура.
Чтобы получилась более красивая структура объектов. Если унаследоваться от прототипа, а не от полноценного массива, то потомок не будет засоряться локальными для массива данными вроде length. Хотя обратное вовсе не вредит. Напротив, тогда этот length можно не инициализировать руками в своём потомке.

Последний раз редактировалось krantadan, 13.07.2013 в 15:33.
Ответить с цитированием