Object.prototype.__lookupGetter__()
å·²å¼ç¨: ä¸åæ¨è使ç¨è¯¥ç¹æ§ãè½ç¶ä¸äºæµè§å¨ä»ç¶æ¯æå®ï¼ä½ä¹è®¸å·²ä»ç¸å ³ç web æ åä¸ç§»é¤ï¼ä¹è®¸æ£åå¤ç§»é¤æåºäºå ¼å®¹æ§èä¿çã请尽éä¸è¦ä½¿ç¨è¯¥ç¹æ§ï¼å¹¶æ´æ°ç°æç代ç ï¼åè§æ¬é¡µé¢åºé¨çå ¼å®¹æ§è¡¨æ ¼ä»¥æå¯¼ä½ ä½åºå³å®ã请注æï¼è¯¥ç¹æ§éæ¶å¯è½æ æ³æ£å¸¸å·¥ä½ã
夿³¨ï¼è¯¥ç¹æ§å·²è¢«å¼ç¨ï¼å»ºè®®ä½¿ç¨ Object.getOwnPropertyDescriptor() APIãè¯¥æ¹æ³çè¡ä¸ºåªé对 Web å
¼å®¹æ§è¿è¡äºè§å®ï¼å¨ä»»ä½å¹³å°ä¸é½ä¸éè¦å®ç°è¯¥æ¹æ³ãå®å¯è½æ æ³å¨ææå°æ¹æ£å¸¸å·¥ä½ã
__lookupGetter__() æ¹æ³è¿åç»å®å°æå®å±æ§ç getter 彿°ã
è¯æ³
__lookupGetter__(prop)
åæ°
prop-
å å«åºè¿åå ¶ getter ç屿§åç§°çå符串ã
è¿åå¼
ç»å®å°æå®å±æ§ç getter 彿°ã妿æ¾ä¸å°è¿æ ·ç屿§æè
è¯¥å±æ§æ¯æ°æ®å±æ§ï¼åè¿å undefinedã
æè¿°
ææç»§æ¿èª Object.prototype ç对象ï¼ä¹å°±æ¯é¤äº null åå对象ç对象ï¼é½ä¼ç»§æ¿ __lookupGetter__() æ¹æ³ãå¦æä¸ºå¯¹è±¡ç屿§å®ä¹äºä¸ä¸ª getterï¼åæ æ³éè¿è¯¥å±æ§å¼ç¨ getter 彿°ï¼å ä¸ºè¯¥å±æ§å¼ç¨è¯¥å½æ°çè¿åå¼ã__lookupGetter__() å¯ç¨äºè·å对 getter 彿°çå¼ç¨ã
__lookupGetter__() 沿çååé¾å䏿¥æ¾æå®ç屿§ã妿ååé¾ä¸çä»»ä½å¯¹è±¡å
·ææå®çèªæå±æ§ï¼åè¿åè¯¥å±æ§ç屿§æè¿°ç¬¦ç get 屿§ãå¦æè¯¥å±æ§æ¯æ°æ®å±æ§ï¼åè¿å undefinedã妿卿´ä¸ªååé¾ä¸é½æ¾ä¸å°è¯¥å±æ§ï¼ä¹åæ ·è¿å undefinedã
__lookupGetter__() å¨è§èä¸è¢«å®ä¹ä¸ºâå¯éè§èâï¼è¿æå³çä¸éè¦ä»»ä½å®ç°æ¥å®ç°å®ãç¶èï¼ææä¸»è¦çæµè§å¨é½å®ç°äºå®ï¼å¹¶ä¸ç±äºå®çæç»ä½¿ç¨ï¼å®ä¸å¤ªå¯è½è¢«å é¤ã妿ä¸ä¸ªæµè§å¨å®ç°äº __lookupGetter__()ï¼é£ä¹å®è¿éè¦å®ç° __lookupSetter__()ã__defineGetter__() å __defineSetter__() æ¹æ³ã
示ä¾
>ä½¿ç¨ __lookupGetter__()
const obj = {
get foo() {
return Math.random() > 0.5 ? "foo" : "bar";
},
};
obj.__lookupGetter__("foo");
// [Function: get foo]
以æ 忹弿¥æ¾å±æ§ç getter
ä½ åºè¯¥ä½¿ç¨ Object.getOwnPropertyDescriptor() API æ¥æ¥æ¾å±æ§ç getterãä¸ __lookupGetter__() ç¸æ¯ï¼è¯¥æ¹æ³å
è®¸æ¥æ¾ Symbol 屿§ãObject.getOwnPropertyDescriptor() æ¹æ³è¿éç¨äº null åå对象ï¼å®ä»¬ä¸ç»§æ¿èª Object.prototypeï¼å æ¤æ²¡æ __lookupGetter__() æ¹æ³ã妿 __lookupGetter__() 沿çååé¾å䏿¥æ¾å±æ§çè¡ä¸ºå¾éè¦ï¼åå¯ä»¥ä½¿ç¨ Object.getPrototypeOf() èªè¡å®ç°å®ã
const obj = {
get foo() {
return Math.random() > 0.5 ? "foo" : "bar";
},
};
Object.getOwnPropertyDescriptor(obj, "foo").get;
// [Function: get foo]
const obj2 = {
__proto__: {
get foo() {
return Math.random() > 0.5 ? "foo" : "bar";
},
},
};
function findGetter(obj, prop) {
while (obj) {
const desc = Object.getOwnPropertyDescriptor(obj, "foo");
if (desc) {
return desc.get;
}
obj = Object.getPrototypeOf(obj);
}
}
console.log(findGetter(obj2, "foo")); // [Function: get foo]
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-object.prototype.__lookupGetter__> |