Что такое ключевое слово " new " в JavaScript?
на new ключевое слово в JavaScript может быть довольно запутанным, когда он впервые столкнулся с, как люди склонны думать, что JavaScript не является объектно-ориентированным языком программирования.
- что это?
- какие проблемы он решает?
- когда это уместно, а когда нет?
14 ответов:
он делает 5 вещей:
- он создает новый объект. Тип этого объекта просто объект.
- он устанавливает этот новый объект внутренний, недоступный,[[прототип]] (т. е. _ _ proto__) свойство быть внешней, доступной функцией конструктора,прототип объект (каждый объект функции автоматически имеет прототип свойства).
- это делает
thisпеременная указывает на вновь созданный объект.- он выполняет функцию конструктора, используя вновь созданный объект всякий раз, когда - это.
- он возвращает вновь созданный объект, если функция-конструктор возвращает
nullссылка на объект. В этом случае вместо этого возвращается ссылка на объект.Примечание: функции-конструктора ссылается на функцию после
newключевое слово, как вnew ConstructorFunction(arg1, arg2)как только это будет сделано, если запрашивается неопределенное свойство нового объекта, скрипт проверит объект [[прототип]] объект для свойства вместо этого. Вот как вы можете получить что-то похожее на традиционное наследование классов в JavaScript.
самая трудная часть об этом-пункт № 2. Каждый объект (включая функции) имеет это внутреннее свойство под названием [[прототип]]. Он может только быть установлен во время создания объекта, либо с новая С
Предположим, у вас есть эта функция:
var Foo = function(){ this.A = 1; this.B = 2; };если вы вызываете это как автономную функцию, например:
Foo();выполнение этой функции добавит два свойства к
В дополнение к ответу Даниэля Говарда, вот что
newделает (или по крайней мере кажется):function New(func) { var res = {}; if (func.prototype !== null) { res.__proto__ = func.prototype; } var ret = func.apply(res, Array.prototype.slice.call(arguments, 1)); if ((typeof ret === "object" || typeof ret === "function") && ret !== null) { return ret; } return res; }пока
var obj = New(A, 1, 2);эквивалентно
var obj = new A(1, 2);
для начинающих, чтобы понять его лучше
попробуйте следующий код в консоли браузера.
function Foo() { return this; } var a = Foo(); //returns window object var b = new Foo(); //returns empty object of foo a instanceof Window; // true a instanceof Foo; // false b instanceof Window; // false b instanceof Foo; // trueТеперь вы можете прочитать ответ сообщества wiki:)
так что это, вероятно, не для создания экземпляры объекта
Он используется именно для этого. Вы определяете конструктор функции следующим образом:
function Person(name) { this.name = name; } var john = new Person('John');однако дополнительное преимущество, которое имеет ECMAScript, вы можете расширить с помощью
.prototypeсобственность, так что мы можем сделать что-то подобное...Person.prototype.getName = function() { return this.name; }все объекты, созданные из этого конструктора теперь будет
getNameиз-за прототипа цепи, к которой они имеют доступ.
JavaScript и объектно-ориентированный язык программирования, и используется именно для создания экземпляров. Он основан на прототипах, а не на классах, но это не означает, что он не является объектно-ориентированным.
Javascript-это динамический язык программирования, который поддерживает парадигму объектно-ориентированного программирования и используется для создания новых экземпляров объекта.
классы не нужны для объектов-Javascript-это прототип на основе язык.
иногда код проще, чем слова:
var func1 = function (x) { this.x = x; } // used with 'new' only var func2 = function (x) { var z={}; z.x = x; return z; } // used both ways func1.prototype.y = 11; func2.prototype.y = 12; A1 = new func1(1); // has A1.x AND A1.y A2 = func1(1); // undefined ('this' refers to 'window') B1 = new func2(2); // has B1.x ONLY B2 = func2(2); // has B2.x ONLYдля меня, пока я не прототип, я использую стиль func2, поскольку он дает мне немного больше гибкости внутри и снаружи функции.
The
newключевое слово для создания новых экземпляров объекта. И да, javascript-это динамический язык программирования, который поддерживает парадигму объектно-ориентированного программирования. Соглашение об именовании объектов, всегда использовать заглавную букву для объектов, которые должны быть созданы с помощью нового ключевого слова.obj = new Element();
есть уже некоторые очень большие ответы, но я публикую новый, чтобы подчеркнуть мое наблюдение на случай III ниже о том, что происходит, когда у вас есть явный оператор return в функции которого
newing вверх. Посмотрите на следующие случаи:Дело I:
var Foo = function(){ this.A = 1; this.B = 2; }; console.log(Foo()); //prints undefined console.log(window.A); //prints 1выше приведен простой случай вызова анонимной функции, на которую указывает
Foo. При вызове этой функции она возвращаетundefined. Так как нет явный оператор возврата, поэтому интерпретатор JavaScript принудительно вставляетreturn undefined;оператор в конце функции. Здесь окно-это объект вызова (contextualthis), который получает новыйAиBсвойства.дело II:
var Foo = function(){ this.A = 1; this.B = 2; }; var bar = new Foo(); console.log(bar()); //illegal isn't pointing to a function but an object console.log(bar.A); //prints 1здесь интерпретатор JavaScript видит
newключевое слово создает новый объект, который действует как объект вызова (contextualthis) анонимной функции, на которую указываетFoo. В этом делеAиBстать свойства на вновь созданный объект (вместо объекта окна). Поскольку у вас нет явного оператора return, интерпретатор JavaScript принудительно вставляет оператор return для возврата нового объекта, созданного из-за использованияnewключевое слово.дело III:
var Foo = function(){ this.A = 1; this.B = 2; return {C:20,D:30}; }; var bar = new Foo(); console.log(bar.C);//prints 20 console.log(bar.A); //prints undefined. bar is not pointing to the object which got created due to new keyword.здесь снова интерпретатор JavaScript видит
newключевое слово создает новый объект, который действует как объект вызова (contextualthis) из анонимная функция, указаннаяFoo. Опять,AиBстать свойствами вновь созданного объекта. Но на этот раз у вас есть явный оператор return, так что интерпретатор JavaScript будет не делать что-нибудь свое.вещь, чтобы отметить в случае III объект создается из-за
newключевое слово потерялось с Вашего радара.barфактически указывает на совершенно другой объект, который не является тем, который JavaScript интерпретатор создан за счетnewключевое слово.
Ну JavaScript на si может сильно отличаться от платформы к платформе, поскольку это всегда реализация исходной спецификации EcmaScript.
в любом случае, независимо от реализации все реализации JavaScript, которые следуют спецификации EcmaScript право, даст вам объектно-ориентированный язык. Согласно стандарту ES:
ECMAScript-это объектно-ориентированный язык программирования для выполнение вычислений и манипулирование вычислительными объектами в среде хоста.
Итак, теперь, когда мы договорились, что JavaScript является реализацией EcmaScript и поэтому является объектно-ориентированным языком. Определение
newоперация в любом объектно-ориентированном языке, говорит, что такое ключевое слово используется для создания экземпляра объекта из класса определенного типа (в том числе анонимных типов, в таких случаях, как C#).в EcmaScript мы не используем классы, как вы можете прочитайте из спецификации:
ECMAScript не использует такие классы, как в C++, Smalltalk или Java. Вместо этого объекты могут быть созданы различными способами, в том числе через литеральная нотация или через конструкторы, которые создают объекты, а затем выполняют код, который инициализирует все или часть из них, назначая начальное значение значения их свойств. Каждый конструктор-это функция, которая имеет свойство ― прототип ‖, который используется для реализации наследования на основе прототипов и общие свойства. Объекты создаются с помощью
использование конструкторов в новых выражениях; например, new Дата(2009,11) создает новый объект Date. Вызов конструктора без использования new имеет последствия, которые зависят от конструктора. Например, Date () создает строковое представление текущая дата и время, а не объект.
The
newключевое слово изменяет контекст, в котором выполняется функция, и возвращает указатель на этот контекст.когда вы не используете
newключевое слово, контекст, в котором функцияVehicle()runs - это тот же контекст, из которого вы вызываете . Элементthisключевое слово будет ссылаться на один и тот же контекст. Когда вы используетеnew Vehicle()новый контекст создается так Ключевое словоthisвнутри функция ссылается на новый контекст. Что вы получаете взамен это вновь созданный контекст.
The
newключевое слово создает экземпляры объектов с помощью функции конструктора. Например:var Foo = function() {}; Foo.prototype.bar = 'bar'; var foo = new Foo(); foo instanceof Foo; // trueэкземпляры наследуются от
prototypeфункции-конструктора. Так что приведем пример выше...foo.bar; // 'bar'
резюме:
The
newключевое слово используется в javascript для создания объекта из функции конструктора. Элементnewключевое слово должно быть помещено перед вызовом функции конструктора и будет делать следующие вещи:
- создает новый объект
- устанавливает прототип этого объекта в свойство prototype функции конструктора
- связывает
thisключевое слово для вновь созданного объекта и выполняет конструктор функция- возвращает вновь созданный объект
пример:
function Dog (age) { this.age = age; } const doggie = new Dog(12); console.log(doggie); console.log(doggie.__proto__ === Dog.prototype) // trueчто именно происходит:
const doggieговорит: нам нужна память для объявления переменной.- оператор присваивания
=говорит: Мы будем инициализировать эту переменную с выражением после=- выражение
new Dog(12). Движок JS видит новое ключевое слово, создает новый объект и устанавливает прототип для собаки.прототип- функция конструктора выполняется с помощью
thisзначение нового объекта. В этот этап, когда возраст назначен на вновь созданный объект песик.- вновь созданный объект возвращается и присваивается переменной песик.
Comments