Являются ли прототипы плохими в JavaScript?

В Руководство по стилю Felix Node.js в нем говорится:

Не расширяйте прототипы любых объекты, особенно родные. Там это особое место в аду, ожидающем если вы не подчиняетесь этому правилу.

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

Итак, когда возникает необходимость продлить прототип объекта?

Ответы

Ответ 1

Нет, прототипы неплохие. Напротив, JavaScript - это прототипный язык, а прототипы - это то, как вы должны расширять объекты.

Цитата не относится к расширению Object.prototype. Не "прототип объекта". Все в JavaScript наследуется от Object, поэтому возиться со своим прототипом все. Он разбивает петли for(var n in obj){ и просто раздражает.

Это единственное, что против прототипов - они появляются в петлях for-in. Помимо этого, они, по FAR, являются наиболее эффективным способом расширения объектов в JS.

Что касается причины - добавление объектов в конструктор, скажем:

function myClass(){
    this.someMethod = function(){ ... }
}

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

myClass.prototype.someMethod = function(){ ... }

означает, что будет только одна копия этой функции. Гораздо больше памяти эффективнее и позволяет производить горячее редактирование языка. Скажем, вы хотите редактировать String.prototype, например:

String.prototype.trim = function(){ ... }

Если вы как-то добавили это конструктору, существующие строки не имели бы метода .trim(), поэтому код: navigator.userAgent.trim() не работал бы, поскольку navigator.userAgent был определен до того, как вы добавили свой метод trim().

И эта статья - просто Тим, анальный и параноидальный. Игнорируйте его:) До тех пор, пока вы не забудете ввести new myClass() вместо просто myClass(), у вас не будет проблем.

Ответ 2

Не расширяйте прототипы любых объекты, особенно родные.

Когда вы расширяете собственные объекты, например, например, строку, которая может быть проблемой, потому что пользователи ожидают какого-либо поведения от этого объекта, но получают разные результаты. Им было трудно отлаживать это.