constructor - garevna/js-course GitHub Wiki
🎓 Конструктор
Настало время разобраться с тем, что же такое конструктор
:white_square_button: Это функция ( отсюда следует, что там можно что-то спрятать )
:white_square_button: Чтобы она работала как конструктор, при вызове перед ее именем нужно указать ключевое слово new, и в этом случае:
- ей не нужен оператор
return, но при этом она вернет экземпляр объекта - внутри нее
thisбудет указывать не наглобальный объект, а на возвращаемый экземпляр - все объявленные внутри нее переменные и функции будут инкапсюлированы в созданном экземпляре (
т.е. будут собственными свойствами и методами экземпляра) - у нее будет свойство
prototype(которое бывает только у функций) - то, что мы поместим в свойство
prototype, унаследуют все экземпляры
:white_square_button: Имена конструкторов принято начинать с заглавной литеры ( потому что по-сути имя конструктора - это имя класса )
:coffee: 1
function Sample ( params ) {}
var obj = new Sample()
Выведем в консоль экземпляр obj:
▼ Sample {}
▼ __proto__:
► constructor: ƒ Sample( params )
► __proto__: Object
- мы создали пустой объект класса Sample
( точнее, мы создали экземпляр объекта ) - у него нет собственных свойств
( потому что в конструкторе ничего не объявлено ) - у него есть цепочка прототипов - это вложенные одно в другое свойства
__proto__ - первое "звено" в цепочке прототипов - это ссылка на свойство
prototypeфункции-конструктора Sample - свойство
prototypeфункции-конструктора Sample является объектом - это значит, что у него тоже есть свойство
__proto__ - это вложенное свойство
__proto__- следующее "звено" в цепочке прототипов - оно является ссылкой на Object
Sample.prototype
▼ {constructor: ƒ}
► constructor: ƒ Sample( params )
► __proto__: Object
Мы можем добавить свойства в prototype конструктора Sample
Sample.prototype.setNewProperty = function ( propName, propValue ) {
this [ propName ] = propValue
}
Если теперь вывести в консоль экземпляр obj, то в его свойстве __proto__ мы обнаружим новое перечислимое свойство setNewProperty ( унаследованный метод )
Вызовем этот метод:
obj.setNewProperty ( "name", "Petro" )
и обнаружим, что у экземпляра obj появилось новое собственное перечислимое свойство name
:warning: При обращении к свойству сначала оно ищется среди собственных свойств экземпляра, и если не будет найдено, то поиск будет продолжен среди свойств прототипа, и так далее, пока не закончится цепочка прототипов
:white_square_button: Конструктор позволяет создавать экземпляры объектов, имеющих не только публичные, но и приватные свойства и методы
:mortar_board: Function
Конструктор
var func = new Function (
`
var x = "Hello"
var y = "baby"
console.log ( x + ", " + y )
`
)
console.log ( func )
func()
Result:
ƒ anonymous(
) {
var x = "Hello"
var y = "baby"
console.log ( x + ", " + y )
}
Hello, baby