Object.prototype.__proto__
å·²å¼ç¨: ä¸åæ¨è使ç¨è¯¥ç¹æ§ãè½ç¶ä¸äºæµè§å¨ä»ç¶æ¯æå®ï¼ä½ä¹è®¸å·²ä»ç¸å ³ç web æ åä¸ç§»é¤ï¼ä¹è®¸æ£åå¤ç§»é¤æåºäºå ¼å®¹æ§èä¿çã请尽éä¸è¦ä½¿ç¨è¯¥ç¹æ§ï¼å¹¶æ´æ°ç°æç代ç ï¼åè§æ¬é¡µé¢åºé¨çå ¼å®¹æ§è¡¨æ ¼ä»¥æå¯¼ä½ ä½åºå³å®ã请注æï¼è¯¥ç¹æ§éæ¶å¯è½æ æ³æ£å¸¸å·¥ä½ã
è¦åï¼ç±äºç°ä»£ JavaScript 弿ä¼å屿§è®¿é®çæ§è´¨ï¼ä¿®æ¹ä¸ä¸ªå¯¹è±¡ç [[Prototype]] 卿¯ä¸ªæµè§å¨å JavaScript 弿ä¸é½æ¯éå¸¸ç¼æ
¢çæä½ãæ¤å¤ï¼ä¿®æ¹ç»§æ¿çæææ¯å¾®å¦å广æ³çï¼ä¸ä»
éäºå¨ obj.__proto__ = ... è¯å¥ä¸è±è´¹çæ¶é´ï¼èæ¯å¯è½æ©å±å°ä»»ä½æè®¿é®ä»»ä½å·²ç»è¢«ä¿®æ¹è¿ [[Prototype]] ç对象ç代ç ãä½ å¯ä»¥å¨è¿éé
读æ´å¤ä¿¡æ¯ï¼JavaScript 弿åºç¡ï¼ä¼åååã
夿³¨ï¼ä½¿ç¨ __proto__ æ¯æäºè®®ä¸ä¸è¢«é¼å±çãå®çåå¨åç¡®åè¡ä¸ºä»
ä½ä¸ºéçç¹æ§è¢«æ ååï¼ä»¥ç¡®ä¿ Web å
¼å®¹æ§ï¼ä½å®åå¨ä¸äºå®å
¨é®é¢å鿣ãä¸ºäºæ´å¥½çæ¯æï¼è¯·ä¼å
ä½¿ç¨ Object.getPrototypeOf()/Reflect.getPrototypeOf() å Object.setPrototypeOf()/Reflect.setPrototypeOf()ã
Object å®ä¾ç __proto__ 访é®å¨å±æ§æ´é²äºæ¤å¯¹è±¡ç [[Prototype]]ï¼ä¸ä¸ªå¯¹è±¡æ nullï¼ã
__proto__ 屿§è¿å¯ä»¥å¨å¯¹è±¡åé¢éå®ä¹ä¸ä½¿ç¨ï¼ä½ä¸ºå建对象æ¶è®¾ç½®å¯¹è±¡ [[Prototype]] çä¸ç§æ¿ä»£æ¹æ³ï¼è䏿¯ä½¿ç¨ Object.create()ã请åè§ï¼å¯¹è±¡åå§å/åé¢éè¯æ³ãè¯¥è¯æ³å·²ç»æ ååï¼å¹¶ä¸å¨å®ç°ä¸å¾å°äºä¼åï¼ä¸ Object.prototype.__proto__ ç¸å½ä¸åã
è¯æ³
obj.__proto__
è¿åå¼
妿ä½ä¸º getter 使ç¨ï¼è¿å对象ç [[Prototype]]ã
å¼å¸¸
TypeError-
妿å°è¯è®¾ç½®ä¸ä¸ªä¸å¯æ©å±å¯¹è±¡æä¸å¯ä¿®æ¹ååçç¹å¼å¯¹è±¡çååï¼ä¾å¦
Object.prototypeæwindowï¼å伿åºé误ã
æè¿°
__proto__ ç getter 彿°æ´é²äºä¸ä¸ªå¯¹è±¡å
é¨ç [[Prototype]] çå¼ã对äºä½¿ç¨å¯¹è±¡åé¢éå建ç对象ï¼è¯¥å¼æ¯ Object.prototypeã对äºä½¿ç¨æ°ç»åé¢éå建ç对象ï¼è¯¥å¼æ¯ Array.prototypeã对äºå½æ°ï¼è¯¥å¼æ¯ Function.prototypeãä½ å¯ä»¥å¨ç»§æ¿ä¸ååé¾ä¸äºè§£æå
³ååé¾çæ´å¤ä¿¡æ¯ã
__proto__ ç setter å
许修æ¹ä¸ä¸ªå¯¹è±¡ç [[Prototype]]ãæä¾çå¼å¿
é¡»æ¯ä¸ä¸ªå¯¹è±¡æ nullãæä¾ä»»ä½å
¶ä»å¼é½ä¸ä¼äº§çä»»ä½ä½ç¨ã
ä¸ Object.getPrototypeOf() å Object.setPrototypeOf() ä¸åï¼å®ä»¬å§ç»ä½ä¸º Object çéæå±æ§åå¨å¹¶å§ç»åæ [[Prototype]] å
é¨å±æ§ã__proto__ 屿§å¹¶ä¸æ»æ¯ä½ä¸ºææå¯¹è±¡ç屿§åå¨ï¼å æ¤ä¸è½å¯é å°åæ [[Prototype]]ã
__proto__ 屿§æ¯ Object.prototype ä¸ä¸ä¸ªç®åç访é®å¨å±æ§ï¼ç± getter å setter 彿°ç»æãå¦æè®¿é® __proto__ 屿§æ¶æç»æ¥è¯¢å° Object.prototypeï¼å伿¾å°è¯¥å±æ§ï¼ä½å¦ææ²¡ææ¥è¯¢ Object.prototypeï¼åä¸ä¼æ¾å°è¯¥å±æ§ã妿卿¥è¯¢ Object.prototype ä¹åå°±æ¾å°äºå
¶ä»ç __proto__ 屿§ï¼åä¼è¦ç Object.prototype ä¸ç __proto__ 屿§ã
null åå对象ä¸ä» Object.prototype ç»§æ¿ä»»ä½å±æ§ï¼å
æ¬ __proto__ 访é®å¨å±æ§ãå æ¤ï¼å¦æä½ å°è¯å¨è¿æ ·ç对象ä¸è¯»å __proto__ï¼åæ 论对象çå®é
[[Prototype]] æ¯ä»ä¹ï¼è¯¥å¼é½å°å§ç»ä¸º undefinedï¼å¹¶ä¸å¯¹ __proto__ çä»»ä½èµå¼é½å°å建ä¸ä¸ªå为 __proto__ çæ°å±æ§ï¼è䏿¯è®¾ç½®å¯¹è±¡çååãæ¤å¤ï¼__proto__ å¯ä»¥éè¿ Object.defineProperty() ä½ä¸ºä»»ä½å¯¹è±¡å®ä¾çèªæå±æ§éæ°å®ä¹ï¼èä¸è§¦å setterãå¨è¿ç§æ
åµä¸ï¼__proto__ å°ä¸åæ¯ [[Prototype]] ç访é®å¨ãå æ¤ï¼ä¸ºè®¾ç½®åè·å对象ç [[Prototype]]ï¼è¯·å§ç»ä½¿ç¨ Object.getPrototypeOf() å Object.setPrototypeOf()ã
示ä¾
>ä½¿ç¨ __proto__
function Circle() {}
const shape = {};
const circle = new Circle();
// 设置该对象çåå
// å·²å¼ç¨ãè¿éåªæ¯ä¸¾ä¸ªä¾åï¼è¯·ä¸è¦å¨ç产ç¯å¢ä¸è¿æ ·åã
shape.__proto__ = circle;
// å¤æè¯¥å¯¹è±¡çååé¾å¼ç¨æ¯å¦å±äº circle
console.log(shape.__proto__ === circle); // true
const ShapeA = function () {};
const ShapeB = {
a() {
console.log("aaa");
},
};
ShapeA.prototype.__proto__ = ShapeB;
console.log(ShapeA.prototype.__proto__); // { a: [Function: a] }
const shapeA = new ShapeA();
shapeA.a(); // aaa
console.log(ShapeA.prototype === shapeA.__proto__); // true
const ShapeC = function () {};
const ShapeD = {
a() {
console.log("a");
},
};
const shapeC = new ShapeC();
shapeC.__proto__ = ShapeD;
shapeC.a(); // a
console.log(ShapeC.prototype === shapeC.__proto__); // false
function Test() {}
Test.prototype.myName = function () {
console.log("myName");
};
const test = new Test();
console.log(test.__proto__ === Test.prototype); // true
test.myName(); // myName
const obj = {};
obj.__proto__ = Test.prototype;
obj.myName(); // myName
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-object.prototype.__proto__> |