JavaScript-да туған объектінің прототипі қандай?

Менде конструктор функциясы бар дейік:

function Cat()
{
  this.tail = "long";
  this.colour = "black";
}

console.log(Cat.prototype); 
// returns an empty [object Object] with no properties (checked with `for...in` loop).

Бұл жағдайда Cat.prototype tail және color жоқ сияқты көрінеді.

var Charlie = new Cat();
console.log(Charlie.tail);

Сонымен, Charlie өздерінің прототипінде анықталмаған жағдайда Cat сипаттарын мұра етеді. Мен прототиптің барлық нүктесі cat - барлық мысалдармен мұраланатын конструктор қасиеттерін айна немесе сақтау үшін - бұл дұрыс емес деп ойладым.

Нысанның прототипі осы қасиеттермен толтырылады? Немесе мысал ретінде Cat.prototype.eyes = brown параметрін нақты анықтаған кезде ғана болады?

Сонымен қатар, Объектінің прототипінің қасиеттерін сұраудың дұрыс әдісі қандай? циклі үшін болып табылады ма? Менің ойымша, ол Object.getOwnPropertyNames (Cat.prototype) бола алмайды, себебі бұл мұраланған сипаттарды қайтармайды.

1
Сіз көбінесе жол сипаттары емес, прототипте әдістерді (функцияларды) қоясыз.
қосылды автор Šime Vidas, көзі
Ия, Object.getOwnPropertyNames (Cat.prototype) жасай аласыз, бұл ештеңе жоқ.
қосылды автор Šime Vidas, көзі

5 жауаптар

Сіз тікелей tail және color сипаттарын анықтайсыз. Бұл сипаттар prototype нысанында анықталмаған.

Btw, әр функция prototype сипатына ие және ол функция өзі құрылған кезде жасалады.

2
қосылды

prototype is completely seperate from this.

this ішіндегі барлық нәрсенің мұрагері болмайды, prototype ішіндегі заттар болады. Әдепкі бойынша сіз Object.prototype (ол бос)

function Cat()
{
  this.tail = "long";
  this.colour = "black";
}
Cat.prototype.getColour = function() {
  return this.colour;
}

WhiteCat.prototype = Cat.prototype;
WhiteCat.prototype.constructor = WhiteCat;

function WhiteCat(name){
  Cat.call(this);
  this.colour = "white";
}    

var c = new Cat();
console.log(c.getColour());//"black"
var w = new WhiteCat();
console.log(w.getColour());//"white"
1
қосылды
Бұл дұрыс емес - this мәні Cat данасын білдіреді және оның prototype сипаты жоқ. Тек қана функциялар (мысалы, Cat ) prototype қасиеттеріне ие.
қосылды автор Šime Vidas, көзі
Бұл жаман емес, сіз оған үйренесіз. Алайда, WhiteCat.prototype = Cat.prototype; - бұл жақсы идея екеніне сенімді емеспін. Сіз әдетте «үлгілер» ( WhiteCat ) жағдайына тән әдістерді анықтау үшін бөлек прототиптерге ие болғыңыз келеді.
қосылды автор Šime Vidas, көзі
А, дұрыс. Бекітілді. Прототиптер өте ауыр болып келеді. Мен ОО-ға жабысқысы келетін болсаңыз, мұрагерлік ету үшін кейбір негіздерді пайдалануды ұсынамын.
қосылды автор Halcyon, көзі

Javascript-тің прототипі Сіз сипаттайтыннан аздап ерекшеленеді. Бұл жағдайда Charlie Charie Cat Cat Кота класы. Cat функциясында this.tail = жолымен барлық мысықтарға құйрық сипатын қосасыз. Бұл new кілт сөзімен Cat функциясын шақырғандықтан толығымен орын алады. Сіз мұны жасаған кезде JavaScript жаңа нысанды жасайды және функцияның контексінде сол нысанға this нүктесін жасайды.

Енді прототиптер басқаша жұмыс істейді, олар объектіде жоқ мүлікті немесе функцияны іздеуге баратын болсаңыз, оларды қадағалайтын тізбек ретінде жақсы ойлайды. Мысалы, егер баруға тырыссаңыз:

Charlie.tickle_wiskers();

Javascript charlie нысанында tickle_wiskers деп аталатын функцияны іздейді. Егер ол функцияны Charlies прототипі (әдепкі бойынша Object.prototype , егер сіз оны нақты анықтамасаңыз) ішінен көре алады. Ақыр аяғында мен мына мысалмен жұмыс істейтін барлық мысықтарды бере аламын:

Cat.prototype.tickle_wiskers = function() { 
      alert('meow');
    }
1
қосылды
Cat.prototype деген объектіні литералмен үстінен жазуды қарастырмаңыз. Бұл Cat.prototype.constructor === Cat қатынасын бұзады. Cat.prototype.tickle = ... арқылы әдістер қосу әдісі
қосылды автор Šime Vidas, көзі
Жақсы сенімдімін. Мен сіздің ұсынысыңыз бойынша редакцияланған
қосылды автор Matthew, көзі

Сонымен қатар, Объектінің прототипінің қасиеттерін сұраудың дұрыс жолы қандай?

var myProto = Object.getPrototypeOf(someObject);
var names = Object.getOwnPropertyNames(myProto);
names.forEach(function (name) {
  value = myProto[name];
  ...
});

Немесе мысал ретінде Cat.prototype.eyes = қоңырды нақты анықтаған кезде ғана болады ма?

Ия, нысанның [[Prototype]] сипаттарында оларды қолмен орнатқанда ғана орнатылады.

Бірақ прототиптің әрбір «данасы» прототиптің объектісіне тірі көрсеткішке ие болғандықтан, бұл өзгерістер нысан жасағаннан кейін көрінеді.

конструктордың барлық қасиеттерін мұраға қалдыратын қасиеттерді сақтау дұрыс емес пе?

Біз прототипте объектілердің қасиеттерін сақтамаймыз. Біз прототиптің/конструктордың барлық даналарын ортақ пайдалануды қалайтын қасиеттерді (негізінен әдістер) сақтаймыз.

0
қосылды

Прототип ешқашан объектіге қойған қасиеттерді ала алмайды. Нысанда прототиптің мүшелері бар, бірақ прототипте нысанның мүшелері жоқ.

Объект прототиптен ешнәрсе мұра етпейді, прототиптегі мүшелер прототипте әлі де бар, олар тек нысаннан қол жетімді. Нысан жасағаннан кейін протоколдан бірдеңені алып тастасаңыз, сол элемент енді қол жетімді емес.

Функция prototype сипатына ие және функцияны конструктор ретінде шақыру үшін new кілт сөзін қолданған кезде, жасалатын нысан функциядан прототип болады.

Функцияның прототипіне бірдеңе қоссаңыз, оны прототипке қоспас бұрын жасасаңыз да, функцияны пайдалана отырып жасалған нысандарға қол жеткізуге болады:

function Cat() {}

var c = new Cat();

Cat.prototype.test = function() {
    alert('test');
};

c.test();//alerts 'test'
0
қосылды