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

Мүмкін, бұл жерде JS gurus және ниндзяларға жалқау мәселе бар, бірақ мұнда:

Нысанның прототипінің нысанын/қасиетін түсінуім - бұл нысанның болашақ даналары үшін жоспар. Осыны ескере отырып, нысанның жаңадан құрылған данасы оны жасаған конструктор объектісіне ұқсас болмауы керек пе?

var x = new Object(); 
console.log(x === Object.prototype);//returns false. why?? 

* UPDATE *

Сондықтан, олар әртүрлі нәрселерге сілтеме жасағандықтан, жалғандықты қайтаратындығын түсінуіме қарамастан, жаңа Object() және Object.prototype сипаттарының басқа сандарын қамтиды. Мәселен менің сұрағыма жауап беру үшін: Prototype Object ішіндегі қасиеттер санын қалай дұрыс тексере аламын; оларды қалай итерациялауға болады?

Мені қарапайым конструкторлық функцияны жасасам:

function Circle(){
   this.tail = "yes, has tail";
}

және ол бар қасиеттер санын алуды қалайды, мысалы:

console.log(Object.getOwnPropertyNames(Circle.prototype)); 
// returns "constructor", I expected it to return "tail"
0

4 жауаптар

=== does not answer the question of whether two things are equivalent, but whether they are references to the same object.

x and Object.prototype in your example may have the same properties, so you can call them equivalent, but they are two dЕгерferent objects.

Егер жасасаңыз

x.foo = 3

олар енді тең емес, өйткені олар екі түрлі нысандар. Сіз басқасын емес, бірін өзгерттіңіз.

Егер

x === Object.prototype

Сол кезде шындық болған

x.foo === Object.prototype.foo

x.foo немесе Object.prototype.foo дегенге тәуелсіз қарамастан, сол болады.

EDIT:

  функциясы Circle() {this.tail = «иә, бар құйрық»; }

console.log (Object.getOwnPropertyNames (Circle.prototype));
// «конструкторды» қайтарады, мен «құйрық»
 

Circle.prototype.tail = ...; дегенді ешқашан жасағаныңыз үшін Circle.prototype tail сипаты жоқ. this.tail = ...; арқылы Circle даналары дегенге тек tail анықтайсыз.

I still find that new Object() and Object.prototype contain a dЕгерferent number of properties.

Сіз сонымен қатар getOwnPropertyNames жасайсыз. меншікті қасиеттері прототиптен мұра етілмеген болып табылады, сондықтан x функциясында осы кодты пайдалану арқылы Object.prototype .

hasOwnProperty құжаттары туралы « меншік меншік «өте жақсы:

This method can be used to determine whether an object has the specЕгерied property as a direct property of that object; unlike the in operator, this method does not check down the object's prototype chain.

2
қосылды
жай ғана жаңартылған мәселе. Бұл бөлікті алыңыз, бірақ әлі де шатыстырылған :(
қосылды автор dkugappi, көзі
@AlexNabokov, өңдеулеріңізге қатысты өңдеулерімді қараңыз.
қосылды автор Mike Samuel, көзі

console.log (Object.getPrototypeOf (x) === Object.prototype);//шын

Егер объектіңізге арналған прототип жолағындағы келесі элементке сілтеме жасайтын [[Prototype]] жасырын сипатын алғыңыз келсе, Object.getPrototypeOf деп теріңіз.

Сондай-ақ, сіз прототиптің тізбегі қалай жұмыс істейтінін түсінбейсіз.

Кез келген объект үшін, егер сіз мүлікті іздесеңіз, ол алдымен сол нысанды қарайды. Содан кейін ол (меншікті сипаты бар ма) объектілерді [[Prototype]] нысандарына қарайды.

Мысал прототипінің тізбектері:

var o = new Object();
// o -> Object.prototype -> null
var a = new Array();
// a -> Array.prototype -> Object.prototype -> null
var Super = function() {};
var Child = function() {};
Child.prototype = Object.create(Super.prototype);
var c = new Child();
// c -> Child.prototype -> Super.prototype -> Object.prototype -> null
1
қосылды

Жаңартуларыңыз туралы:

this within a constructor function is the instance created with the new keyword, not the prototype.

Мәселен, сіздің үзіндііңіз болған жағдайда ...

function Circle(){
   this.tail = "yes, has tail";
}

this.tail параметрін орнату келесіге ұқсас:

var c = new Circle();
c.tail = "yes, has tail";

tail is only a property of the instance.

prototype үлгісіндегі tail параметрін орнату үшін сіз:

Circle.prototype.tail = "yes, has tail";

Енді «меншік» сипаттары тікелей данаға орнатылған. Бұл санауыш және сол аттың прототипі сипаттарын алдын ала анықтау:

function Circle() {
   //give the instance its "own" `foo` property
    this.foo = 'qux';
}

Circle.prototype.foo = 'foo';
Circle.prototype.bar = 'bar';

var c = new Circle();

console.log(c.foo);//the overridden "qux", not the inherited "foo"
console.log(c.bar);//"bar", as inherited

// yet the prototype still persists to have its "own" `foo`
console.log(Circle.prototype.foo);//"foo"

// While the instance has keys for all involved properties
console.log(Object.keys(c));//[ "foo", "bar" ]

// It also retains which are its "own"
console.log(Object.getOwnPropertyNames(c));//[ "foo" ]
0
қосылды
Мен көргім келеді, рахмет, конструктор функциясын жасаған кезде, прототип - бұл конструктор анықтағанның көшірмесі.
қосылды автор dkugappi, көзі

x - «Объект» данасы. Сізде конструктор ретінде Object бар ма екенін тексеру керек. Прототип - конструктор емес. Мұны көріңіз

var x = new Object(); 
console.log(x.constructor === Object);
0
қосылды
.constructor - бұл де-факто стандарт. Кейбір адамдар .constructor пайдалануды ұмытып қалады және мұндай логика үзіледі.
қосылды автор Raynos, көзі