å·²å¼ç¨: ä¸åæ¨è使ç¨è¯¥ç¹æ§ãè½ç¶ä¸äºæµè§å¨ä»ç¶æ¯æå®ï¼ä½ä¹è®¸å·²ä»ç¸å ³ç 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__
ç¸å½ä¸åã
妿ä½ä¸º 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()
ã
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
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4