Ответ 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()
, у вас не будет проблем.