Эсибизде тургандай, конструктор функциясын колдонуу менен жаңы объекттерди түзсө болот new F()
.
Эгер F.prototype
объект камтылса, билдирүү аны жаңы объект new
катары белгилейт .[[Prototype]]
JavaScript жаралгандан бери прототиптик мурасты колдонуп келет. Бул тилдин негизги өзгөчөлүктөрүнүн бири болуп саналат.
Бирок мурда, эски күндөрдө объекттин прототибине түз жетүү мүмкүн болгон эмес. Бул бөлүмдө сүрөттөлгөн "prototype"
конструктор функциясынын касиети гана ишенимдүү иштеген. Ошондуктан, ал көптөгөн сценарийлерде колдонулат.
F.prototype
Кадимки мүлк эмне "prototype"
үчүн аталганына көңүл буруңуз F
. Бул азырынча "объекттин прототиби" эмес, F
ошол аталыштагы кадимки касиет.
Мисал келтирели:
@A@let animal = {
eats: true
};
function Rabbit(name) {
this.name = name;
}
Rabbit.prototype = animal;
let rabbit = new Rabbit("White Rabbit"); // rabbit.__proto__ == animal
alert( rabbit.eats ); // true@A@
Орнотуу Rabbit.prototype = animal
түзмө-түз котормочуга төмөнкүлөрдү айтат: "Аркылуу объект түзүп жатканда, аны " деп new Rabbit()
жазыңыз .animal
[[Prototype]]
Натыйжа мындай болот:
Сүрөттө: "prototype"
- үчүн кадимки касиетти көрсөтүүчү горизонталдуу жебе "F"
, жана [[Prototype]]
- тик жебе, rabbit
-дан мурасты көрсөтүүчү animal
.
F.prototype
new F() чакырылган
учурунда гана колдонулатF.prototype
чакырганда гана колдонулат жана жаңы объекттин new F()
менчиги катары дайындалат . [[Prototype]]
Андан кийин F.prototype
, жаңы объект да эч нерсени байлабайт. Объектке «бир жолку белек» деп түшүнүү керек.
Түзүлгөндөн кийин F.prototype
, ал өзгөрүшү мүмкүн жана менен түзүлгөн жаңы объекттер new F()
башка объектке ээ болот [[Prototype]]
, бирок мурунтан эле бар объекттер эскисин сактап калат.
F.prototype демейки, constructor касиети
Ар бир функциянын демейки боюнча касиети бар "prototype"
.
Демейки конструктор функциясына тиешелүү "prototype"
бир касиети бар объект .constructor
Мына бири:
@A@function Rabbit() {}
/* прототип по умолчанию
Rabbit.prototype = { constructor: Rabbit };
*/@A@
Аны текшерип көрөлү:
@A@function Rabbit() {}
// по умолчанию:
// Rabbit.prototype = { constructor: Rabbit }
alert( Rabbit.prototype.constructor == Rabbit ); // true@A@
Демек, биз эч нерсени өзгөртпөсөк, анда мүлк constructor
бардык коёндор үчүн жеткиликтүү болот [[Prototype]]
:
@A@function Rabbit() {}
// по умолчанию:
// Rabbit.prototype = { constructor: Rabbit }
let rabbit = new Rabbit(); // наследует от {constructor: Rabbit}
alert(rabbit.constructor == Rabbit); // true (свойство получено из прототипа)@A@
constructor
Жаңы объектти түзүү үчүн биз бар объекттин касиетин колдоно алабыз .
Мисал:
@A@function Rabbit(name) {
this.name = name;
alert(name);
}
let rabbit = new Rabbit("White Rabbit");
let rabbit2 = new rabbit.constructor("Black Rabbit");@A@
Бул бизде объект болгондо ыңгайлуу, бирок аны түзүү үчүн кайсы конструктор колдонулганын билбейбиз (мисалы, ал үчүнчү тараптын китепканасынан алынышы мүмкүн) жана дагы бир ушундай объектти түзүү керек.
Бирок, балким, мүлк жөнүндө эң маанилүү нерсе "constructor"
бул ...
…JavaScript өзүнөн өзү менчиктин туура баасына кепилдик бербейт "constructor"
.
Ооба, бул функциялардагы демейки касиет "prototype"
, бирок кийинчерээк ага эмне болору бизден көз каранды.
Тактап айтканда, биз демейки прототибин башка объект менен алмаштырсак, анда анда "constructor"
эч кандай касиет болбойт.
Мисалы:
@A@function Rabbit() {}
Rabbit.prototype = {
jumps: true
};
let rabbit = new Rabbit();
alert(rabbit.constructor === Rabbit); // false@A@
Ошентип, касиетти туура сактоо үчүн "constructor"
, биз аны толугу менен кайра жазуунун ордуна демейки прототипке касиеттерди кошуу/алып салуу/өзгөртүү керек:
@A@function Rabbit() {}
// Не перезаписываем Rabbit.prototype полностью,
// а добавляем к нему свойство
Rabbit.prototype.jumps = true
// Прототип по умолчанию сохраняется, и мы всё ещё имеем доступ к Rabbit.prototype.constructor
Же мүлктү кайра түзө алабыз constructor
:
Rabbit.prototype = {
jumps: true,
constructor: Rabbit
};
// теперь свойство constructor снова корректное, так как мы добавили его@A@
Бардыгы
[[Prototype]]
Бул бөлүмдө биз конструктор функциясы менен түзүлгөн объекттерге орнотуунун жолун кыскача сүрөттөп бердик . Бул функцияны кантип колдонсо болорун кийинчерээк карап чыгабыз.
Баары абдан жөнөкөй. Келгиле, негизги ойлорду бөлүп көрөлү:
- Мүлк
F.prototype
(менен чаташтырбоо керек[[Prototype]]
)[[Prototype]]
жаңы объекттерди чакырганда орнототnew F()
. - Маани
F.prototype
объект же болушу керекnull
. Башка баалуулуктар иштебейт. - Менчик
"prototype"
тарабынан чакырылган конструктор функциясына ыйгарылганда гана өзгөчөлүк өзгөчө болотnew
.
Жөнөкөй объекттерде prototype
өзгөчө эч нерсе жок:
@A@let user = {
name: "John",
prototype: "Bla-bla" // никакой магии нет - обычное свойство
};@A@
Демейки боюнча, бардык функциялар бар F.prototype = { constructor: F }
, ошондуктан объекттин конструкторун касиети аркылуу ала алабыз "constructor"
.
Tasks
Төмөнкү коддо биз жаңы коёнду түзүп new Rabbit
, андан кийин анын прототибин өзгөртүүгө аракет кылабыз.
Алгач бизде бул код бар:
@A@function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
alert( rabbit.eats ); // true
-
Келгиле, бир сапты кошолу (төмөндөгү коддо белгиленген). Кыйынчылык
alert
бизге азыр эмнени көрсөтөт?function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); Rabbit.prototype = {}; alert( rabbit.eats ); // ?
-
... Ал эми код ушундай болсо (бир сап алмаштырылган)?
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); Rabbit.prototype.eats = false; alert( rabbit.eats ); // ?
-
Же ушул сыяктуу (бир сап алмаштырылды)?
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); delete rabbit.eats; alert( rabbit.eats ); // ?
-
Же акыры ушундай:
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); delete Rabbit.prototype.eats; alert( rabbit.eats ); // ?@A@