контент переехал из сниппетов в статьи
При помощи оператора new можно создать объект (объект Function).
За оператором new необходимо указать имя функции-конструктора; данная функция-конструктор выполняет инициализацию свойств объекта.
В функцию-конструктор передается ключевое слово this , которое ссылается на только что созданный объект.
Существуют встроенные конструкторы javascript, например: Array() , Date() , RegExp() . Стоит отметить: конструктор Object() создает пустой объект, что равнозначно использованию литерала объекта {} .
Прототип – это значение свойства prototype функции конструктора. Каждая функция имеет свойство prototype , данное свойство ссылается на предопределенный объект-прототип. Этот объект работает только в том случае, если функция используется как конструктор, то есть совместно с оператором new.
Каждый объект имеет свойство constructor ; это свойство ссылается на функцию-конструктор, которая, как говорилось выше, выполняет инициализацию свойств объекта.
Как видите, свойство r_method всегда ссылается на неизменяемую (в отличие от свойств, которые уникальны для каждого объекта) функцию. Поэтому рациональнее добавить ее к прототипу. Мы можем сделать простой вывод: объект-прототип подходящее место для констант и методов. Так как любой объект наследует свойства своего прототипа, то наша функция (r_method) автоматически добавится всем объектам, инициализированным конструктором (example_constr).
Классы javascript
Javascript не поддерживает классы как таковые. Однако вы можете создавать псевдоклассы, используя функции-конструкторы и прототипы объектов. Конструктор – это класс.
Назначение конструктора - создать новый объект, установить и возвратить его в качестве значения конструктора.
Имя конструктора обычно является существительным, пишется с прописной буквы и описывает конструируемый объект. Конструкторы, как правило, используют для создания объектов, соответствующих одному шаблону.
Пример создания объекта,
определение конструктора,
и установка свойства для прототипа:
// объект var opa = {}; var opa_ = {x:0, y:"yes"} var D = new Date(); // текущая дата /* Свойство constructor */ document.write(D.constructor); // function Date() { } D.constructor == Date // true // определяем конструктор: function example_constr(r,t) { this.ad = r; this.ak = t; // метод, но лучше определить как св-во прототипа /* this.r_method = function () { this.qu = this.ad - this.ak; }*/ // метод, но внутри метода не используем свойства объекта this.a_method = function (x,y) { alert(x+y); } } // объявляем метод (r_method) в прототипе // это предпочтительнее, чем использовать r_method в ф-и конструкторе // по причине того, что ф-я r_method не имеет уникальных св-в, в отличие // от вышеприведенных свойств (ad,ak) example_constr.prototype.r_method = function () { this.qu = this.ad - this.ak; } // вызываем конструктор и создаем объект example_constr (krot) var krot = new example_constr(14,15); // что равнозначно krot = {ad:14,ak:15} krot.r_method(); // выведет: //alert(krot.qu); // -1 //krot.a_method(11,11); // выведет: // 22
Дополнение:
Чтобы создать собственный конструктор, достаточно описать функцию, в которой ключевое слово this будет ссылаться на объекты (которые создаются посредством функции конструктора). Смотрите выше на примере example_constr .
console.dir
js
console.dir(obj); // выведет все свойства объекта в консолиОбъекты в javascript позволяют воссоздать концепцию объектно-ориентированного программирования
Для того чтобы создавать объекты одного типа используют функции-конструкторы. Отличие конструктора от обычной функции в том, что конструктор вызывается через специальный оператор new .
При использовании new в функции-конструкторе return может вернуть только объект, причем этот объект заменит возвращаемый по умолчанию объект this .
Приватные переменные и функции
У функции-конструктора могут быть как приватные данные (такие данные внешний код может получить, но изменить не может), так и публичные.
javascript
// определяем конструктор: function example_constr(r,t,name) { // this = {} создается автоматически this.ad = r; this.ak = t; this.a_method = function (x,y) { alert(x+y); } // функция-конструктор и без всякого return // возвращает объект this // приватная переменная (то есть из внешнего кода ее можно получить, // но нельзя изменить): this.getName = function(){ return name; } // также можно использовать обычные переменные, // которые будут доступны в лишь пределах функции-конструктора: var page, password; var ogo = function(){ //................ }; } var newObj = new example_constr(1,2,"Вася"); console.dir(newObj); console.log(newObj.getName()); //знать
- ОБЪЕКТЫ javascript работают только со строковыми свойствами, то есть, если свойство не указано как строка, то оно все равно станет строкой.
The constructor method is a special method for creating and initializing an object created within a class .
The source for this interactive example is stored in a GitHub repository. If you"d like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Syntax
constructor([arguments ]) { ... }Description
There can be only one special method with the name "constructor" in a class. Having more than one occurrence of a constructor method in a class will throw a SyntaxError error.
Class Square extends Polygon { constructor(length) { // Here, it calls the parent class" constructor with lengths // provided for the Polygon"s width and height super(length, length); // Note: In derived classes, super() must be called before you // can use "this". Leaving this out will cause a reference error. this.name = "Square"; } get area() { return this.height * this.width; } set area(value) { this.area = value; } }
Another example
Take a look at this code snippet
Class Polygon { constructor() { this.name = "Polygon"; } } class Square extends Polygon { constructor() { super(); } } class Rectangle {} Object.setPrototypeOf(Square.prototype, Rectangle.prototype); console.log(Object.getPrototypeOf(Square.prototype) === Polygon.prototype); //false console.log(Object.getPrototypeOf(Square.prototype) === Rectangle.prototype); //true let newInstance = new Square(); console.log(newInstance.name); //Polygon
Here the prototype of Square class is changed but still the constructor of the previous base class Polygon is called when a new instance of a square is being created.
Default constructors
As stated, if you do not specify a constructor method a default constructor is used. For base classes the default constructor is:
Constructor() {}
For derived classes, the default constructor is:
Constructor(...args) { super(...args); }
Specifications
Specification | Status | Comment |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) |
Standard | Initial definition. |
ECMAScript Latest Draft (ECMA-262) The definition of "Constructor Method" in that specification. |
Draft |
Browser compatibility
The compatibility table on this page is generated from structured data. If you"d like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Update compatibility data on GitHub
Desktop | Mobile | Server | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Android webview | Chrome for Android | Firefox for Android | Opera for Android | Safari on iOS | Samsung Internet | Node.js | |
constructor | Chrome
Full support
49 Notes Full support 49Notes Notes | Edge Full support 13 | Firefox Full support 45 | IE No support No | Opera Full support 36 | Safari Full support 9 | WebView Android
Full support
49 Notes Full support 49Notes Notes From Chrome 42 to 48 strict mode is required. Non-strict mode support can be enabled using the flag "Enable Experimental JavaScript". | Chrome Android Full support Yes | Firefox Android Full support 45 | Opera Android ? | Safari iOS Full support 9 | Samsung Internet Android Full support Yes | nodejs Full support 6.0.0 Full support 6.0.0 Full support 4.0.0 |
Пример
function Person(first, last, age, eye) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eye;
}
Считается хорошей практикой называть функции конструктора с первой буквой верхнего регистра.
Типы объектов (чертежи) (классы)
Примеры из предыдущих глав ограничены. Они только создают одиночные объекты.
Иногда мы нуждаемся в "план " для создания многих объектов одного и того же "типа".
Способ создания "типа объекта", заключается в использовании функции конструктора объектов .
В приведенном выше примере функция Person () является функцией конструктора объектов.
Объекты одного типа создаются путем вызова функции конструктора с помощью ключевого слова New :
var myFather = new Person("John", "Doe", 50, "blue");
var myMother = new Person("Sally", "Rally", 48, "green");
Ключевое слово this
В JavaScript, вещь называется это объект, который "владеет" код.
Значение this , при использовании в объекте, является сам объект.
В функции конструктора это значение не имеет. Он заменяет новый объект. Значение этого параметра станет новым объектом при создании нового объекта.
Добавление свойства к объекту
Добавить новое свойство к существующему объекту очень просто:
Пример
myFather.nationality = "English";
Свойство будет добавлено в моего отца. Не моя мать. (не для других объектов Person).
Добавление метода к объекту
Добавить новый метод к существующему объекту очень просто:
Пример
myFather.name = function () {
return this.firstName + " " + this.lastName;
};
Метод будет добавлен в моего отца. Не моя мать. (не для других объектов Person).
Добавление свойства в конструктор
Нельзя добавить новое свойство в конструктор объектов так же, как добавляется новое свойство к существующему объекту:
Пример
Person.nationality = "English";
Чтобы добавить новое свойство в конструктор, необходимо добавить его в функцию конструктора:
Пример
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eyecolor;
this.nationality = "English";
}
Таким образом, свойства объекта могут иметь значения по умолчанию.
Добавление метода в конструктор
Функция конструктора также может определять методы:
Пример
function Person(first, last, age, eyecolor) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eyecolor;
this.name = function() {return this.firstName + " " + this.lastName;};
}
Нельзя добавить новый метод в конструктор объектов так же, как добавить новый метод к существующему объекту.
Добавление методов к объекту должно выполняться внутри функции конструктора:
Пример
function Person(firstName, lastName, age, eyeColor) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.eyeColor = eyeColor;
this.changeName = function (name) {
this.lastName = name;
};
}
Функция чанженаме () присваивает значение Name свойству "Фамилия" пользователя.
Объект Math () отсутствует в списке. Математика является глобальным объектом. Ключевое слово New не может использоваться в математике.
Ты знала?
Как вы можете видеть выше, JavaScript имеет версии объектов примитивных типов данных String, number и Boolean. Но нет причин создавать сложные объекты. Примитивные значения намного быстрее.
Используйте литералы объекта {} вместо нового объекта ().
Используйте строковые литералы "" вместо новой строки ().
Используйте числовые литералы 12345 вместо нового числа ().
Используйте логические литералы true/false вместо New Boolean ().
Используйте литералы массива вместо нового массива ().
Используйте шаблонные литералы /()/ вместо нового регулярного выражения ().
Используйте выражения функции () {} вместо новой функции ().
Пример
var x1 = {}; // new object
var x2 = ""; // new primitive string
var x3 = 0; // new primitive number
var x4 = false; // new primitive boolean
var x5 = ; // new array object
var x6 = /()/ // new regexp object
var x7 = function(){}; // new function object
У каждого объекта, созданного с помощью конструктора, есть неявно добавленное свойство constructor , содержащее ссылку на конструктор, с помощью которого был создан объект:
Console.log(user.constructor === User); // true
Свойство constructor предназначено для идентификации типа объекта. Тоже самое позволяет сделать оператор instanceof :
Console.log(user instanceof User); // true
При использовании конструктора для создания объекта, для каждого созданного объекта создаётся своя копия свойств и методов.
Шаблон "Прототип"
Когда создаётся функция, в неё по умолчанию добавляется свойство prototype . Значением свойства prototype является объект, содержащий общие свойства и методы, которые доступны всем объектам, созданным с помощью этого конструктора.
Вместо того, чтобы указывать свойства и методы в конструкторе, их можно указать непосредственно прототипу:
Function User() {} User.prototype.name = "Homer"; User.prototype.age = "33"; User.prototype.sayHi = function () { console.log("Hello!"); }; let user = new User(); console.log(user.name);
По умолчанию все прототипы имеют только свойство constructor , содержащее ссылку на функцию, к которой оно относится:
Function foo() {} console.log(foo.prototype.constructor === foo); // true
Все остальные методы и свойства наследуются от типа Object . Когда с помощью конструктора создаётся новый объект, в нём определяется внутренний указатель (ссылка) на прототип конструктора. Доступ к этому указателю можно получить с помощью метода Object.getPrototypeOf() :
Function foo() {} let obj = new foo(); console.log(Object.getPrototypeOf(obj) === foo.prototype); // true
При чтении свойства объекта начинается его поиск. Сначала свойство с указанным именем ищется в самом объекте. Если оно обнаруживается у объекта, возвращается значение свойства, если свойства с таким именем нет у объекта, поиск продолжается в прототипе. В случае обнаружения свойства у прототипа возвращается его значение. Так прототипы обеспечивают совместное использование свойств и методов у объектов.
Если в объект добавить свойство с именем, как у свойства прототипа, то у объекта будет создано собственное свойство, в этом случае при следующем чтении свойства будет использоваться свойство объекта, а не прототипа.
Чтобы писать меньше кода, можно перезаписать прототип литералом объекта, содержащим все свойства и методы:
Function User() {} User.prototype = { name: "Homer", age: 33, sayHi: function () { console.log("Hello!"); } }; // Восстановление свойства constructor Object.defineProperty(User.prototype, "constructor", { enumerable: false, value: User });
В этом примере свойству User.prototype присваивается новый объект, созданный с помощью литерала. Он полностью заменяет собою объект, предлагаемый по умолчанию. Результат получается таким же, как и в предыдущем примере, за одним исключением: свойство constructor больше не указывает на функцию User . Явное добавление свойства constructor со значением User в литерал объекта решает эту проблему. Свойство constructor у встроенных объектов по умолчанию неперечислимо, поэтому для его добавления использовался метод Object.defineProperty() .
Объединение шаблонов "конструктор" и "прототип"
С помощью конструктора определяют собственные свойства, а с помощью прототипа – общие методы и свойства:
Function User(name, age) { this.name = name; this.age = age; } User.prototype.sayHi = function () { console.log("Hello!"); }
Function Person(first, last, age, eye) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eye; }
Считается хорошей практикой программирования, чтобы название функции конструкторов начиналось с большой буквы.
Объектные типы (Шаблоны) (Классы)
Примеры из предыдущих глав значительно ограничены. В них создается только одиночные объекты.
Тем не менее, иногда требуется иметь некий "шаблон", по которому можно было бы создавать множество объектов одного и того же "типа".
Для создания "объектного типа" и используется функция конструктора объекта .
В приведенном в начале этой главы примере функция Person() является функцией конструктора объекта.
Объекты одного и того же типа создаются при помощи вызова функции конструктора с ключевым словом new :
Var myFather = new Person("John", "Doe", 50, "blue"); var myMother = new Person("Sally", "Rally", 48, "green");
Ключевое слово this
В JavaScript ключевое слово this обозначает объект, которому "принадлежит" данный код.
Значением ключевого слова this , когда оно используется в объекте, является сам объект.
В функции конструктора у ключевого слова this нет значения. Это "подстановка" для нового объекта. Когда будет создан новый объект, тогда значением ключевого слова this и станет этот новый объект.
Обратите внимание, что this это не переменная, а ключевое слово. Вы не можете изменять его значение.
Добавление свойства к объекту
Добавить новое свойство к существующему объекту очень просто:
MyFather.nationality = "English";
Свойство будет добавлено к объекту myFather, но не к объекту myMother. (Или какому-либо другому объекту типа person).
Добавление метода к объекту
Добавить новый метод к существующему объекту очень просто:
MyFather.name = function () { return this.firstName + " " + this.lastName; };
Метод будет добавлен к объекту myFather, но не к объекту myMother. (Или какому-либо другому объекту типа person).
Добавление свойства к конструктору объекта
Нельзя добавлять новое свойство к конструктору объекта тем же способом, как это делается в случае с существующим объектом.
Чтобы добавить новое свойство к конструктору, вы должны добавить его в функцию конструктора:
Function Person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; this.nationality = "English"; }
При этом свойствам объекта можно устанавливать значения по умолчанию.
Добавление метода к конструктору объекта
Функция конструктора также может определять методы:
Function Person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; this.name = function() {return this.firstName + " " + this.lastName;}; }
Нельзя добавлять новые методы к конструктору объекта тем же способом, как это делается в случае с существующим объектом. Добавление методов к объекту должно происходить внутри функции конструктора:
Function Person(firstName, lastName, age, eyeColor) { this.firstName = firstName; this.lastName = lastName; this.age = age; this.eyeColor = eyeColor; this.changeName = function (name) { this.lastName = name; }; }
Функция changeName() присваивает значение параметра name свойству lastName объекта person:
MyMother.changeName("Doe");
JavaScript знает, о каком объекте идет речь, "подставляя" в ключевое слово this объект myMother .
Встроенные конструкторы JavaScript
В JavaScript есть встроенные конструкторы для собственных объектов:
Var x1 = new Object(); // Новый объект Object var x2 = new String(); // Новый объект String var x3 = new Number(); // Новый объект Number var x4 = new Boolean(); // Новый объект Boolean var x5 = new Array(); // Новый объект Array var x6 = new RegExp(); // Новый объект RegExp var x7 = new Function(); // Новый объект Function var x8 = new Date(); // Новый объект Date
В этом списке нет объекта Math(), так как это глобальный объект. Ключевое слово new нельзя использовать с объектом Math.
А вы знали?
Как видно из приведенного выше кода, в JavaScript есть объектные версии примитивных типов данных String, Number и Boolean. Однако нет никаких причин создавать для этих типов комплексные объекты. Примитивные значения работают быстрее.
Таким образом:
- используйте объектные литералы { } вместо new Object().
- используйте строковые литералы "" вместо new String().
- используйте числовые литералы 12345 вместо new Number().
- используйте логические литералы true / false вместо new Boolean().
- используйте литералы-массивы вместо new Array().
- используйте литералы-шаблоны /()/ вместо new RexExp().
- используйте выражения функций () {} вместо new Function().