Loading...

f.prototype

f.prototype

 

Эсибизде тургандай, конструктор функциясын колдонуу менен жаңы объекттерди түзсө болот 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

маанилүүлүгү: 5

Төмөнкү коддо биз жаңы коёнду түзүп new Rabbit, андан кийин анын прототибин өзгөртүүгө аракет кылабыз.

Алгач бизде бул код бар:

 
 
@A@function Rabbit() {}
Rabbit.prototype = {
  eats: true
};

let rabbit = new Rabbit();

alert( rabbit.eats ); // true
  1. Келгиле, бир сапты кошолу (төмөндөгү коддо белгиленген). Кыйынчылык alertбизге азыр эмнени көрсөтөт?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype = {};
    
    alert( rabbit.eats ); // ?
  2. ... Ал эми код ушундай болсо (бир сап алмаштырылган)?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype.eats = false;
    
    alert( rabbit.eats ); // ?
  3. Же ушул сыяктуу (бир сап алмаштырылды)?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    delete rabbit.eats;
    
    alert( rabbit.eats ); // ?
  4. Же акыры ушундай:

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    delete Rabbit.prototype.eats;
    
    alert( rabbit.eats ); // ?@A@