Function.prototype.prototype
å½ Function å®ä¾ä½ä¸ºæé 彿°ä¸ new è¿ç®ç¬¦ä¸èµ·ä½¿ç¨æ¶ï¼è¯¥å®ä¾ç prototype æ°æ®å±æ§å°ç¨ä½æ°å¯¹è±¡çååã
å¼
ä¸ä¸ªå¯¹è±¡ã
Function.prototype.prototype ç屿§ç¹æ§ | |
|---|---|
| å¯å | æ¯ |
| 坿䏾 | å¦ |
| å¯é ç½® | å¦ |
夿³¨ï¼ç±»ç prototype 屿§æ¯ä¸å¯åçã
æè¿°
å¨ä½¿ç¨ new è¿ç®ç¬¦è°ç¨å½æ°æ¶ï¼æé 彿°ç prototype 屿§å°æä¸ºæ°å¯¹è±¡çååã
function Ctor() {}
const inst = new Ctor();
console.log(Object.getPrototypeOf(inst) === Ctor.prototype); // true
å
³äºæé 彿°ç prototype 屿§ä¸ç»æå¯¹è±¡çååä¹é´çç¸äºä½ç¨ï¼ä½ å¯ä»¥æ¥çç»§æ¿ä¸åå龿¥äºè§£æ´å¤ã
ä¸ä¸ªå
·æ prototype 屿§ç彿°ä¹å¹¶ä¸ä»£è¡¨å
¶æèµæ ¼ä½ä¸ºæé 彿°ãä¾å¦ï¼function* æ¥æ prototype 屿§ï¼ä½å®ä¸è½éè¿ new è¿ç®ç¬¦æ¥è°ç¨ã
async function* asyncGeneratorFunction() {}
function* generatorFunction() {}
åä¹ï¼çæå¨å½æ°é常å¨å®ä»¬ä¸è¢« new è¿ç®ç¬¦è°ç¨çæ¶å被ç¨å°å®ä»¬ç prototype 屿§ã prototype 屿§ä¼ä½ä¸ºè¿åç Generator 对象çååã
å¦å¤ï¼ä¸äºå½æ°ä¹å¯è½å¨éè¿ new è¿ç®ç¬¦è°ç¨çæ
åµä¸æ æ¡ä»¶æåºï¼å³ä¾¿å®ä»¬å¯è½å
·æ prototypeãä¾å¦ï¼Symbol() å BigInt() 彿°ä¼å¨å®ä»¬éè¿ new è¿ç®ç¬¦æ¥è°ç¨æ¶æåºï¼å 为 Symbol.prototype and BigInt.prototype åªæ¯ç¨æ¥ä¸ºåå§å¼æä¾æ¹æ³çï¼è¿æ¶ä¸åºè¯¥ç´æ¥æå»ºå
è£
å¨å¯¹è±¡ã
ä¸åç彿°ä¸å
·æ prototype 屿§ï¼å æ¤ä¸è½æä¸ºæé 彿°ï¼å³ä¾¿åç»æå¨èµäºäº prototype 屿§ï¼
const method = { foo() {} }.foo;
const arrowFunction = () => {};
async function asyncFunction() {}
ä¸ååå¯ä»¥æä¸ºåæ³çæé 彿°ï¼å 为å®ä»¬å
·æ prototypeï¼
class Class {}
function fn() {}
ç»å®å½æ°ä¸å
·æ prototype 屿§ï¼ä½æ¯å¯è½æ¯å¯æé çãå½å®è¢«æé çæ¶åï¼ç®æ 彿°å°ä¼è¢«æé ï¼å¦æç®æ 彿°æ¯å¯æé çï¼å°ä¼è¿åä¸ä¸ªæ®éçå®ä¾ã
const boundFunction = function () {}.bind(null);
é»è®¤æ
åµä¸ï¼å½æ°ç prototype æ¯ä¸ä¸ªæ®éç对象ãè¿ä¸ªå¯¹è±¡å
·æä¸ä¸ªå±æ§ï¼constructorã宿¯å¯¹è¿ä¸ªå½æ°æ¬èº«çä¸ä¸ªå¼ç¨ã constructor 屿§æ¯å¯ç¼è¾ãå¯é
ç½®ä½ä¸å¯æä¸¾çã
妿彿°ç prototype 被èµäºäº Object 以å¤çå¼ï¼åå½å®è¢« new è¿ç®ç¬¦è°ç¨æ¶ï¼è¿å对象çååå°ä¼æå Object.prototypeãï¼æ¢å¥è¯è¯´ï¼new è¿ç®ç¬¦ä¼å¿½ç¥å®ç prototype 屿§å¹¶æé ä¸ä¸ªæ®é对象ãï¼
function Ctor() {}
Ctor.prototype = 3;
console.log(Object.getPrototypeOf(new Ctor()) === Object.prototype); // true
示ä¾
>éè¿ä¿®æ¹ååç屿§æ¥ä¿®æ¹ææå®ä¾çåå
function Ctor() {}
const p1 = new Ctor();
const p2 = new Ctor();
Ctor.prototype.prop = 1;
console.log(p1.prop); // 1
console.log(p2.prop); // 1
å°é彿°å±æ§æ·»å å°ç±»çååä¸
å
¬æç±»å段ä¼ä¸ºæ¯ä¸ä¸ªå®ä¾é½æ·»å 屿§ãç±»æ¹æ³å¯ä»¥å¨ååä¸å®ä¹å½æ°å±æ§ã使¯ï¼æ æ³å°é彿°å±æ§æ·»å å°ååä¸ãåå¦ä½ 叿卿æå®ä¾ä¹é´å
±äº«éææ°æ®ï¼ä¾å¦ï¼Error.prototype.name 卿æ Error ç±»çå®ä¾ä¸é½æ¯ç¸åçï¼ï¼é£ä¹ä½ å¯ä»¥å¨ç±»çååä¸è¿è¡æå¨æ·»å ã
class Dog {
constructor(name) {
this.name = name;
}
}
Dog.prototype.species = "dog";
console.log(new Dog("Jack").species); // "dog"
使ç¨éæåå§ååå¯ä»¥è®©è¿ä¸ªæä½æ´ç¬¦åç´è§ãè¿äºåä¼å¨ç±»åå§åçæ¶åè¿è¡è°ç¨ã
class Dog {
static {
Dog.prototype.species = "dog";
}
constructor(name) {
this.name = name;
}
}
console.log(new Dog("Jack").species); // "dog"
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification > # sec-function-instances-prototype > |