Является ли новый оператор Javascript чем-либо, но затрудняет жизнь?

Я исхожу из традиционного фона веб-разработчиков, где я никоим образом не могу утверждать, что я действительно знаю что-нибудь о Javascript, но я стараюсь.

В настоящее время у меня есть то, что я бы назвал как довольно послушное понимание JQuery, немного лучшее понимание закрытий, и я прочитал, и чувствую, что я достаточно ясно понимаю Дугласа Крокфорда "Javascript: The Good Parts".

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

На самом деле, из моего чтения вышеупомянутой книги, оператор ничего не делает, что вы не могли бы сделать еще один более простой способ и вынудили вас взломать переменную 'this'.

Так что-то мне не хватает? Действительно ли новый оператор служит цели или это просто трюк, чтобы сделать программистов ОО удобными в том, что в основе функционального языка? Буду ли я лучше удалять его полностью из своего словаря JS?

Ответ 1

Прежде всего, наградность чтения Javascript: The Good Parts - отличная книга на этом языке.

Чтобы ответить на ваш вопрос, оператор new требуется, если вы хотите использовать прототипное наследование. Другого способа иметь объект "наследовать" от другого нет. При этом вы можете копировать свойства с одного объекта на другой, что в некоторых случаях устраняет необходимость в операторе.

Например, классический подход будет использовать следующее:

function MyClass() {};
MyClass.prototype.sayHello = function() {
   alert('hello');
};


var o = new MyClass();
o.sayHello();

Вы можете достичь относительно той же самой вещи следующим образом:

function MyClass() {
   return { 
      sayHello: function() {
         alert('hello');
      }
   };
}

var o = MyClass();
o.sayHello();

Ответ 2

Вы воспитали Крокфорда "JavaScript: хорошие детали".

Новый - плохая часть. Я не использую его. (Ну, почти никогда.)

Крокфорд действительно использует его (в своем методе beget()).

Определенно не используйте его, когда вы можете использовать что-то еще. Создавайте объекты и массивы с литералами объектов и массивов.

Ответ 3

Нет ничего плохого в операторе new. Для меня Крокфорд неубедителен в этом вопросе. Всякий раз, когда вы создаете объект, вы либо используете new где-то в своем коде, либо используете его неявно, создавая литералы (например, литералы объектов, такие как {a: 1} или литералы массива, такие как [a, b, c]).

Ответ 4

Вот отличная статья о реализации prototype.js типичного структурирования OO. Это было бы невозможно без "нового" оператора.

http://prototypejs.org/learn/class-inheritance

Я очень рекомендую прочитать источник prototype.js. jQuery поражает и очень популярен, но некоторые из вещей, которые были сделаны в прототипе, не имеют никакого сравнения ** в другом месте, в частности, их классовом структурировании.

** Некоторые люди могут утверждать, что некоторые из прототипов не должны быть найдены в другом месте - это другой вопрос. Но для ясного понимания того, что возможно с javascript, прототип - это путь, ИМХО.