æä»¬è¿è®°å¾ï¼å¯ä»¥ä½¿ç¨è¯¸å¦ new F() è¿æ ·çæé 彿°æ¥å建ä¸ä¸ªæ°å¯¹è±¡ã
妿 F.prototype æ¯ä¸ä¸ªå¯¹è±¡ï¼é£ä¹ new æä½ç¬¦ä¼ä½¿ç¨å®ä¸ºæ°å¯¹è±¡è®¾ç½® [[Prototype]]ã
JavaScript ä»ä¸å¼å§å°±æäºååç»§æ¿ãè¿æ¯ JavaScript ç¼ç¨è¯è¨çæ ¸å¿ç¹æ§ä¹ä¸ã
使¯å¨è¿å»ï¼æ²¡æç´æ¥å¯¹å
¶è¿è¡è®¿é®çæ¹å¼ãå¯ä¸å¯é çæ¹æ³æ¯æ¬ç« ä¸ä¼ä»ç»çæé 彿°ç "prototype" 屿§ãç®åä»æè®¸å¤èæ¬ä»å¨ä½¿ç¨å®ã
请注æï¼è¿éç F.prototype æçæ¯ F çä¸ä¸ªå为 "prototype" ç常è§å±æ§ãè¿å¬èµ·æ¥ä¸âååâè¿ä¸ªæ¯è¯å¾ç±»ä¼¼ï¼ä½è¿éæä»¬å®é
ä¸æçæ¯å
·æè¯¥ååç常è§å±æ§ã
ä¸é¢æ¯ä¸ä¸ªä¾åï¼
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
设置 Rabbit.prototype = animal çåé¢æææ¯ï¼âå½å建äºä¸ä¸ª new Rabbit æ¶ï¼æå®ç [[Prototype]] èµå¼ä¸º animalâã
è¿æ¯ç»æç¤ºæå¾ï¼
å¨ä¸å¾ä¸ï¼"prototype" æ¯ä¸ä¸ªæ°´å¹³ç®å¤´ï¼è¡¨ç¤ºä¸ä¸ªå¸¸è§å±æ§ï¼[[Prototype]] æ¯åç´çï¼è¡¨ç¤º rabbit ç»§æ¿èª animalã
F.prototype ä»
ç¨å¨ new F æ¶F.prototype 屿§ä»
å¨ new F 被è°ç¨æ¶ä½¿ç¨ï¼å®ä¸ºæ°å¯¹è±¡ç [[Prototype]] èµå¼ã
妿å¨å建ä¹åï¼F.prototype 屿§æäºååï¼F.prototype = <another object>ï¼ï¼é£ä¹éè¿ new F åå»ºçæ°å¯¹è±¡ä¹å°é乿¥ææ°ç对象ä½ä¸º [[Prototype]]ï¼ä½å·²ç»åå¨ç对象å°ä¿ææ§æçå¼ã
é»è®¤ç F.prototypeï¼æé å¨å±æ§
æ¯ä¸ªå½æ°é½æ "prototype" 屿§ï¼å³ä½¿æä»¬æ²¡ææä¾å®ã
é»è®¤ç "prototype" æ¯ä¸ä¸ªåªæå±æ§ constructor ç对象ï¼å±æ§ constructor æå彿°èªèº«ã
åè¿æ ·ï¼
function Rabbit() {}
/* é»è®¤ç prototype
Rabbit.prototype = { constructor: Rabbit };
*/
æä»¬å¯ä»¥æ£æ¥ä¸ä¸ï¼
function Rabbit() {}
// é»è®¤ï¼
// Rabbit.prototype = { constructor: Rabbit }
alert( Rabbit.prototype.constructor == Rabbit ); // true
é常ï¼å¦ææä»¬ä»ä¹é½ä¸åï¼constructor 屿§å¯ä»¥éè¿ [[Prototype]] ç»ææ rabbits 使ç¨ï¼
function Rabbit() {}
// é»è®¤ï¼
// Rabbit.prototype = { constructor: Rabbit }
let rabbit = new Rabbit(); // ç»§æ¿èª {constructor: Rabbit}
alert(rabbit.constructor == Rabbit); // true (from prototype)
æä»¬å¯ä»¥ä½¿ç¨ constructor 屿§æ¥å建ä¸ä¸ªæ°å¯¹è±¡ï¼è¯¥å¯¹è±¡ä½¿ç¨ä¸ç°æå¯¹è±¡ç¸åçæé å¨ã
åè¿æ ·ï¼
function Rabbit(name) {
this.name = name;
alert(name);
}
let rabbit = new Rabbit("White Rabbit");
let rabbit2 = new rabbit.constructor("Black Rabbit");
彿们æä¸ä¸ªå¯¹è±¡ï¼ä½ä¸ç¥éå®ä½¿ç¨äºåªä¸ªæé å¨ï¼ä¾å¦å®æ¥èªç¬¬ä¸æ¹åºï¼ï¼å¹¶ä¸æä»¬éè¦å建å¦ä¸ä¸ªç±»ä¼¼ç对象æ¶ï¼ç¨è¿ç§æ¹æ³å°±å¾æ¹ä¾¿ã
使¯ï¼å
³äº "constructor" æéè¦çæ¯â¦â¦
â¦â¦JavaScript èªèº«å¹¶ä¸è½ç¡®ä¿æ£ç¡®ç "constructor" 彿°å¼ã
æ¯çï¼å®åå¨äºå½æ°çé»è®¤ "prototype" ä¸ï¼ä½ä»
æ¤èå·²ãä¹åä¼åçä»ä¹ ââ å®å
¨åå³äºæä»¬ã
ç¹å«æ¯ï¼å¦ææä»¬å°æ´ä¸ªé»è®¤ prototype æ¿æ¢æï¼é£ä¹å
¶ä¸å°±ä¸ä¼æ "constructor" äºã
ä¾å¦ï¼
function Rabbit() {}
Rabbit.prototype = {
jumps: true
};
let rabbit = new Rabbit();
alert(rabbit.constructor === Rabbit); // false
å æ¤ï¼ä¸ºäºç¡®ä¿æ£ç¡®ç "constructor"ï¼æä»¬å¯ä»¥éæ©æ·»å /å é¤å±æ§å°é»è®¤ "prototype"ï¼è䏿¯å°å
¶æ´ä¸ªè¦çï¼
function Rabbit() {}
// ä¸è¦å° Rabbit.prototype æ´ä¸ªè¦ç
// å¯ä»¥åå
¶ä¸æ·»å å
容
Rabbit.prototype.jumps = true
// é»è®¤ç Rabbit.prototype.constructor 被ä¿çäºä¸æ¥
æè
ï¼ä¹å¯ä»¥æå¨éæ°å建 constructor 屿§ï¼
Rabbit.prototype = {
jumps: true,
constructor: Rabbit
};
// è¿æ ·ç constructor 乿¯æ£ç¡®çï¼å 为æä»¬æå¨æ·»å äºå®
æ»ç»
卿¬ç« ä¸ï¼æä»¬ç®è¦ä»ç»äºä¸ºéè¿æé 彿°å建ç对象设置 [[Prototype]] çæ¹æ³ãç¨åæä»¬å°çå°æ´å¤ä¾èµäºæ¤çé«çº§ç¼ç¨æ¨¡å¼ã
ä¸åé½å¾ç®åï¼åªéè¦è®°ä½å æ¡éç¹å°±å¯ä»¥æ¸ æ°å°ææ¡äºï¼
F.prototype屿§ï¼ä¸è¦æå®ä¸[[Prototype]]弿··äºï¼å¨new F被è°ç¨æ¶ä¸ºæ°å¯¹è±¡ç[[Prototype]]èµå¼ãF.prototypeçå¼è¦ä¹æ¯ä¸ä¸ªå¯¹è±¡ï¼è¦ä¹å°±æ¯nullï¼å ¶ä»å¼é½ä¸èµ·ä½ç¨ã"prototype"屿§ä» å½è®¾ç½®å¨ä¸ä¸ªæé 彿°ä¸ï¼å¹¶éè¿newè°ç¨æ¶ï¼æå ·æè¿ç§ç¹æ®çå½±åã
å¨å¸¸è§å¯¹è±¡ä¸ï¼prototype 没ä»ä¹ç¹å«çï¼
let user = {
name: "John",
prototype: "Bla-bla" // è¿éåªæ¯æ®éç屿§
};
é»è®¤æ
åµä¸ï¼ææå½æ°é½æ F.prototype = {constructorï¼F}ï¼æä»¥æä»¬å¯ä»¥éè¿è®¿é®å®ç "constructor" 屿§æ¥è·åä¸ä¸ªå¯¹è±¡çæé å¨ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼