Что такое «новое» ключевое слово в JavaScript? - PullRequest
1647 голосов
/ 30 октября 2009

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

  • Что это?
  • Какие проблемы это решает?
  • Когда это уместно, а когда нет?

Ответы [ 14 ]

3 голосов
/ 30 октября 2009

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

obj = new Element();
1 голос
/ 31 августа 2018

Резюме:

Ключевое слово new используется в javascript для создания объекта из функции конструктора. Ключевое слово new должно быть помещено перед вызовом функции конструктора и будет выполнять следующие действия:

  1. Создает новый объект
  2. Устанавливает прототип этого объекта в свойство prototype функции конструктора
  3. Связывает ключевое слово this с вновь созданным объектом и выполняет функцию конструктора
  4. Возвращает вновь созданный объект

Пример:

function Dog (age) {
  this.age = age;
}

const doggie = new Dog(12);

console.log(doggie);
console.log(doggie.__proto__ === Dog.prototype) // true

Что именно происходит:

  1. const doggie говорит: нам нужна память для объявления переменной.
  2. Оператор присвоения = говорит: мы собираемся инициализировать эту переменную с помощью выражения после =
  3. Выражение new Dog(12). Движок JS видит новое ключевое слово, создает новый объект и устанавливает прототип в Dog.prototype
  4. Функция конструктора выполняется со значением this, установленным для нового объекта. На этом этапе возраст назначается новому созданному объекту "песик".
  5. Вновь созданный объект возвращается и присваивается переменной doggie.
1 голос
/ 14 мая 2015

Ну, JavaScript на уровне системы может сильно отличаться от платформы к платформе, поскольку это всегда реализация оригинальной спецификации EcmaScript.

В любом случае, независимо от реализации, все реализации JavaScript, которые соответствуют спецификации EcmaScript, дадут вам объектно-ориентированный язык. Согласно стандарту ES:

ECMAScript - это объектно-ориентированный язык программирования для выполнение вычислений и манипулирование вычислительными объектами в среде хоста.

Итак, теперь мы договорились, что JavaScript - это реализация EcmaScript и, следовательно, это объектно-ориентированный язык. Определение операции new в любом объектно-ориентированном языке говорит, что такое ключевое слово используется для создания экземпляра объекта из класса определенного типа (включая анонимные типы, в случаях, подобных C #).

В EcmaScript мы не используем классы, как вы можете прочитать из спецификации:

ECMAScript не использует классы, такие как в C ++, Smalltalk или Java. Вместо этого объекты могут быть созданы различными способами, включая буквенная нотация или с помощью конструкторов, которые создают объекты, а затем выполняют код, который инициализирует все или часть из них, присваивая начальные значения их свойств. Каждый конструктор является функцией, которая имеет свойство по имени - прототип, который используется для реализации наследования и общих свойств на основе прототипа. Объекты созданы
использование конструкторов в новых выражениях; например, новый Date (2009,11) создает новый объект Date. Вызов конструктора без использования нового имеет последствия, которые зависят от конструктора. Например, Date () создает строковое представление текущая дата и время, а не объект.

1 голос
/ 30 октября 2009

Ключевое слово new создает экземпляры объектов, используя функции в качестве конструктора. Например:

var Foo = function() {};
Foo.prototype.bar = 'bar';

var foo = new Foo();
foo instanceof Foo; // true

Экземпляры наследуются от prototype функции конструктора. Итак, приведенный выше пример ...

foo.bar; // 'bar'
...