Baseline Widely available *
Object
æ¯ JavaScript çä¸ç§æ°æ®ç±»åãå®ç¨äºåå¨åç§é®å¼éå忴夿çå®ä½ãå¯ä»¥éè¿ Object()
æé 彿°æè
使ç¨å¯¹è±¡åé¢éçæ¹å¼å建对象ã
å¨ JavaScript ä¸ï¼å 乿æçå¯¹è±¡é½æ¯ Object
çå®ä¾ï¼ä¸ä¸ªå
¸åçå¯¹è±¡ä» Object.prototype
ç»§æ¿å±æ§ï¼å
æ¬æ¹æ³ï¼ï¼å°½ç®¡è¿äºå±æ§å¯è½è¢«è¦çï¼æè
说éåï¼ãå¯ä¸ä¸ä» Object.prototype
ç»§æ¿ç对象æ¯é£äº null
ååå¯¹è±¡ï¼æè
æ¯ä»å
¶ä» null
åå对象继æ¿èæ¥ç对象ã
éè¿ååé¾ï¼ææå¯¹è±¡é½è½è§å¯å° Object.prototype
å¯¹è±¡çæ¹åï¼é¤éè¿äºæ¹åææ¶åç屿§åæ¹æ³æ²¿çååé¾è¢«è¿ä¸æ¥éåãå°½ç®¡ææ½å¨çå±é©ï¼ä½è¿ä¸ºè¦çææ©å±å¯¹è±¡çè¡ä¸ºæä¾äºä¸ä¸ªéå¸¸å¼ºå¤§çæºå¶ã为äºä½¿å
¶æ´å å®å
¨ï¼Object.prototype
æ¯æ ¸å¿ JavaScript è¯è¨ä¸å¯ä¸å
·æä¸å¯åååç对象ââObject.prototype
çååå§ç»ä¸º null
ä¸ä¸å¯æ´æ¹ã
ä½ åºè¯¥é¿å
è°ç¨ä»»ä½ Object.prototype
æ¹æ³ï¼ç¹å«æ¯é£äºä¸æç®å¤æåçæ¹æ³ï¼å³åªæå
¶åå§è¡ä¸ºæ¯åççï¼ä¸æ æ³è¢«ä»»ä½ç»§æ¿ç对象以åççæ¹å¼éåï¼ãææä» Object.prototype
ç»§æ¿ç对象é½å¯ä»¥èªå®ä¹ä¸ä¸ªå
·æç¸ååç§°ä½è¯ä¹å¯è½ä¸ä½ ç颿å®å
¨ä¸åçèªæå±æ§ãæ¤å¤ï¼è¿äºå±æ§ä¸ä¼è¢« null
åå对象继æ¿ãç°ä»£ JavaScript ä¸ç¨äºæä½å¯¹è±¡çå·¥å
·æ¹æ³é½æ¯éæçãæ´å
·ä½å°è¯´ï¼
valueOf()
ãtoString()
å toLocaleString()
åå¨çç®çæ¯ä¸ºäºå¤æåï¼ä½ åºè¯¥ææå¯¹è±¡ä¼å®ä¹èªå·±çå®ç°å¹¶å
·æåççè¡ä¸ºï¼å æ¤ä½ å¯ä»¥å°å®ä»¬ä½ä¸ºå®ä¾æ¹æ³è°ç¨ã使¯ï¼valueOf()
å toString()
é常æ¯éè¿å¼ºå¶ç±»å转æ¢éå¼è°ç¨çï¼å æ¤ä½ ä¸éè¦å¨ä»£ç ä¸èªå·±è°ç¨å®ä»¬ã__defineGetter__()
ã__defineSetter__()
ã__lookupGetter__()
å __lookupSetter__()
已被å¼ç¨ï¼ä¸åºè¯¥å使ç¨ã请使ç¨éææ¹æ³ Object.defineProperty()
å Object.getOwnPropertyDescriptor()
ä½ä¸ºæ¿ä»£ã__proto__
屿§å·²è¢«å¼ç¨ï¼ä¸åºè¯¥å使ç¨ã请使ç¨éææ¹æ³ Object.getPrototypeOf()
å Object.setPrototypeOf()
ä½ä¸ºæ¿ä»£ãpropertyIsEnumerable()
å hasOwnProperty()
æ¹æ³å¯ä»¥åå«ç¨éææ¹æ³ Object.getOwnPropertyDescriptor()
å Object.hasOwn()
æ¿æ¢ãprototype
屿§ï¼é常å¯ä»¥ç¨ instanceof
ä»£æ¿ isPrototypeOf()
æ¹æ³ã妿ä¸åå¨è¯ä¹ä¸çä»·çéææ¹æ³ï¼æè
ä½ ççæ³ä½¿ç¨ Object.prototype
æ¹æ³ï¼ä½ åºè¯¥éè¿ call()
ç´æ¥å¨ç®æ 对象ä¸è°ç¨ Object.prototype
æ¹æ³ï¼ä»¥é²æ¢å ç®æ 对象ä¸åææ¹æ³è¢«éåè产çæå¤çç»æã
const obj = {
foo: 1,
// 妿å¯è½çè¯ï¼ä½ ä¸åºè¯¥å¨èªå·±ç对象ä¸å®ä¹è¿æ ·çæ¹æ³ï¼
// 使¯å¦æä½ ä»å¤é¨è¾å
¥æ¥æ¶å¯¹è±¡ï¼å¯è½æ æ³é²æ¢è¿ç§æ
åµçåç
propertyIsEnumerable() {
return false;
},
};
obj.propertyIsEnumerable("foo"); // falseï¼é¢æå¤çç»æ
Object.prototype.propertyIsEnumerable.call(obj, "foo"); // trueï¼é¢æçç»æ
ä»å¯¹è±¡ä¸å é¤å±æ§
ä¸ä¸ªå¯¹è±¡æ¬èº«æ²¡æä»»ä½æ¹æ³å¯ä»¥ï¼å Map.prototype.delete()
䏿 ·ï¼å é¤èªå·±ç屿§ãè¦å é¤ä¸ä¸ªå¯¹è±¡ç屿§ï¼å¿
é¡»ä½¿ç¨ delete è¿ç®ç¬¦ã
å 乿æç JavaScript 对象æç»é½ç»§æ¿èª Object.prototype
ï¼åè§ç»§æ¿ä¸ååé¾ï¼ãç¶èï¼ä½ å¯ä»¥ä½¿ç¨ Object.create(null)
æå®ä¹äº __proto__: null
ç对象åé¢éè¯æ³ï¼æ³¨æï¼å¯¹è±¡åé¢éä¸ç __proto__
é®ä¸åäºå·²å¼ç¨ç Object.prototype.__proto__
屿§ï¼æ¥å建 null
åå对象ãä½ è¿å¯ä»¥éè¿è°ç¨ Object.setPrototypeOf(obj, null)
å°ç°æå¯¹è±¡çååæ´æ¹ä¸º null
ã
const obj = Object.create(null);
const obj2 = { __proto__: null };
null
åå对象å¯è½ä¼æä¸äºé¢æå¤çè¡ä¸ºè¡¨ç°ï¼å 为å®ä¸ä¼ä» Object.prototype
ç»§æ¿ä»»ä½å¯¹è±¡æ¹æ³ãè¿å¨è°è¯æ¶å°¤å
¶éè¦æ³¨æï¼å 为常è§çå¯¹è±¡å±æ§è½¬æ¢/æ£æµå®ç¨æ¹æ³å¯è½ä¼äº§çé误æä¸¢å¤±ä¿¡æ¯ï¼ç¹å«æ¯å¨ä½¿ç¨äºå¿½ç¥é误çéé»é误æè·æºå¶çæ
åµä¸ï¼ã
ä¾å¦ï¼Object.prototype.toString()
æ¹æ³ç缺失é常ä¼ä½¿å¾è°è¯åå¾å°é¾ï¼
const normalObj = {}; // å建ä¸ä¸ªæ®é对象
const nullProtoObj = Object.create(null); // å建ä¸ä¸ª "null" åå对象
console.log(`normalObj æ¯ï¼${normalObj}`); // æ¾ç¤º "normalObj æ¯ï¼[object Object]"
console.log(`nullProtoObj æ¯ï¼${nullProtoObj}`); // æåºé误ï¼Cannot convert object to primitive value
alert(normalObj); // æ¾ç¤º [object Object]
alert(nullProtoObj); // æåºé误ï¼Cannot convert object to primitive value
å ¶ä»æ¹æ³ä¹ä¼å¤±è´¥ã
normalObj.valueOf(); // æ¾ç¤º {}
nullProtoObj.valueOf(); // æåºé误ï¼nullProtoObj.valueOf is not a function
normalObj.hasOwnProperty("p"); // æ¾ç¤º "true"
nullProtoObj.hasOwnProperty("p"); // æåºé误ï¼nullProtoObj.hasOwnProperty is not a function
normalObj.constructor; // æ¾ç¤º "Object() { [native code] }"
nullProtoObj.constructor; // æ¾ç¤º "undefined"
æä»¬å¯ä»¥éè¿ä¸º null
åå对象åé
屿§çæ¹å¼å° toString
æ¹æ³æ·»å åå»ï¼
nullProtoObj.toString = Object.prototype.toString; // ç±äºæ°å¯¹è±¡ç¼ºå° `toString` æ¹æ³ï¼å æ¤éè¦å°åå§çéç¨ `toString` æ¹æ³æ·»å 忥ã
console.log(nullProtoObj.toString()); // æ¾ç¤º "[object Object]"
console.log(`nullProtoObj æ¯ï¼${nullProtoObj}`); // æ¾ç¤º "nullProtoObj æ¯ï¼[object Object]"
æ®é对象ç toString()
æ¹æ³æ¯å¨å¯¹è±¡çååä¸çï¼è䏿®é对象ä¸åçæ¯ï¼è¿éç toString()
æ¹æ³æ¯ nullProtoObj
çèªæå±æ§ãè¿æ¯å 为 nullProtoObj
没æååï¼å³ä¸º null
ï¼ã
å¨å®è·µä¸ï¼null
åå对象é常被ç¨ä½ map çç®åæ¿ä»£åãç±äºåå¨ Object.prototype
屿§ï¼ä¼å¯¼è´ä¸äºé误ï¼
const ages = { alice: 18, bob: 27 };
function hasPerson(name) {
return name in ages;
}
function getAge(name) {
return ages[name];
}
hasPerson("hasOwnProperty"); // true
getAge("toString"); // [Function: toString]
使ç¨ä¸ä¸ª null
åå对象å¯ä»¥æ¶é¤è¿ç§é£é©ï¼åæ¶ä¸ä¼ä»¤ hasPerson
å getAge
彿°åå¾å¤æï¼
const ages = Object.create(null, {
alice: { value: 18, enumerable: true },
bob: { value: 27, enumerable: true },
});
hasPerson("hasOwnProperty"); // false
getAge("toString"); // undefined
å¨è¿ç§æ åµä¸ï¼æ·»å 任使¹æ³é½åºè¯¥æ éï¼å 为å®ä»¬å¯è½ä¼ä¸åå¨ä¸ºæ°æ®çå ¶ä»é®å¼å¯¹æ··æ·ã
è®©ä½ ç对象ä¸ç»§æ¿èª Object.prototype
è¿å¯ä»¥é²æ¢ååæ±¡ææ»å»ãå¦ææ¶æèæ¬å Object.prototype
æ·»å ä¸ä¸ªå±æ§ï¼ç¨åºä¸çæ¯ä¸ªå¯¹è±¡ä¸é½å¯è®¿é®å®ï¼é¤äºé£äºåå为 null
ç对象ã
const user = {};
// æ¶æèæ¬ï¼
Object.prototype.authenticated = true;
// æå¤å
许æªç»èº«ä»½éªè¯çç¨æ·éè¿
if (user.authenticated) {
// è®¿é®æºå¯æ°æ®
}
JavaScript è¿å
·æå
ç½®ç APIï¼ç¨äºçæ null
åå对象ï¼ç¹å«æ¯é£äºå°å¯¹è±¡ç¨ä½ä¸´æ¶é®å¼å¯¹éåç APIãä¾å¦ï¼
Object.groupBy()
æ¹æ³çè¿åå¼RegExp.prototype.exec()
æ¹æ³è¿åç»æä¸ç groups
å indices.groups
屿§Array.prototype[Symbol.unscopables]
屿§ï¼ææ [Symbol.unscopables]
对象ååé½åºè¯¥ä¸º null
ï¼import.meta
对象import * as ns from "module"
æ import()
è·åçæ¨¡åå½å空é´å¯¹è±¡ânull
åå对象âè¿ä¸ªæ¯è¯é常ä¹å
æ¬å
¶ååé¾ä¸æ²¡æ Object.prototype
çä»»ä½å¯¹è±¡ãå½ä½¿ç¨ç±»æ¶ï¼å¯ä»¥éè¿ extends null
æ¥åå»ºè¿æ ·ç对象ã
许å¤å ç½®æä½é¦å å°å®ä»¬çåæ°å¼ºå¶è½¬æ¢ä¸ºå¯¹è±¡ã该è¿ç¨å¯ä»¥æ¦æ¬å¦ä¸ï¼
undefined
å null
åæåº TypeError
ãNumber
ãString
ãBoolean
ãSymbol
ãBigInt
çåºæ¬ç±»å被å°è£
æå
¶å¯¹åºçåºæ¬ç±»å对象ãå¨ JavaScript ä¸å®ç°ç¸åææçæä½³æ¹å¼æ¯ä½¿ç¨ Object()
æé 彿°ãObject(x)
å¯ä»¥å° x
转æ¢ä¸ºå¯¹è±¡ï¼å¯¹äº undefined
æ null
ï¼å®ä¼è¿åä¸ä¸ªæ®é对象è䏿¯æåº TypeError
å¼å¸¸ã
使ç¨å¯¹è±¡å¼ºå¶è½¬æ¢çå°æ¹å æ¬ï¼
for...in
循ç¯ç object
åæ°ãArray
æ¹æ³ç this
å¼ãObject
æ¹æ³çåæ°ï¼å¦ Object.keys()
ãthis
å¼ãåºæ¬ç±»åå¼è¢«å°è£
为对象ï¼è null
å undefined
è¢«æ¿æ¢ä¸ºå
¨å±å¯¹è±¡ãä¸è½¬æ¢ä¸ºåºæ¬ç±»åä¸åï¼å¯¹è±¡å¼ºå¶è½¬æ¢è¿ç¨æ¬èº«æ æ³ä»¥ä»»ä½æ¹å¼è¢«è§å¯å°ï¼å 为å®ä¸ä¼è°ç¨å toString
æ valueOf
æ¹æ³è¿æ ·çèªå®ä¹ä»£ç ã
Object()
å°è¾å ¥è½¬æ¢ä¸ºä¸ä¸ªå¯¹è±¡ã
Object.assign()
å°ä¸ä¸ªæå¤ä¸ªæºå¯¹è±¡çææå¯æä¸¾èªæå±æ§çå¼å¤å¶å°ç®æ 对象ä¸ã
Object.create()
ä½¿ç¨æå®çåå对象å屿§å建ä¸ä¸ªæ°å¯¹è±¡ã
Object.defineProperties()
å对象添å å¤ä¸ªç±ç»å®æè¿°ç¬¦æè¿°çå½å屿§ã
Object.defineProperty()
å对象添å ä¸ä¸ªç±ç»å®æè¿°ç¬¦æè¿°çå½å屿§ã
Object.entries()
è¿åå
å«ç»å®å¯¹è±¡èªæå¯æä¸¾åç¬¦ä¸²å±æ§çææ [key, value]
æ°ç»ã
Object.freeze()
å»ç»ä¸ä¸ªå¯¹è±¡ãå ¶ä»ä»£ç ä¸è½å é¤ææ´æ¹å ¶ä»»ä½å±æ§ã
Object.fromEntries()
ä»ä¸ä¸ªå
å« [key, value]
对çå¯è¿ä»£å¯¹è±¡ä¸è¿åä¸ä¸ªæ°ç对象ï¼Object.entries
çåæä½ï¼ã
Object.getOwnPropertyDescriptor()
è¿åä¸ä¸ªå¯¹è±¡çå·²å½å屿§ç屿§æè¿°ç¬¦ã
Object.getOwnPropertyDescriptors()
è¿åä¸ä¸ªå å«å¯¹è±¡ææèªæå±æ§ç屿§æè¿°ç¬¦ç对象ã
Object.getOwnPropertyNames()
è¿åä¸ä¸ªå å«ç»å®å¯¹è±¡çææèªæå¯æä¸¾åä¸å¯æä¸¾å±æ§åç§°çæ°ç»ã
Object.getOwnPropertySymbols()
è¿åä¸ä¸ªæ°ç»ï¼å®å å«äºæå®å¯¹è±¡ææèªæ symbol 屿§ã
Object.getPrototypeOf()
è¿åæå®å¯¹è±¡çååï¼å
é¨ç [[Prototype]]
屿§ï¼ã
Object.hasOwn()
妿æå®å±æ§æ¯æå®å¯¹è±¡çèªæå±æ§ï¼åè¿å true
ï¼å¦åè¿å false
ãå¦æè¯¥å±æ§æ¯ç»§æ¿çæä¸åå¨ï¼åè¿å false
ã
Object.is()
æ¯è¾ä¸¤ä¸ªå¼æ¯å¦ç¸åãææ NaN
å¼é½ç¸çï¼è¿ä¸ ==
使ç¨ç IsLooselyEqual
å ===
使ç¨ç IsStrictlyEqual
ä¸åï¼ã
Object.isExtensible()
å¤æå¯¹è±¡æ¯å¦å¯æ©å±ã
Object.isFrozen()
å¤æå¯¹è±¡æ¯å¦å·²ç»å»ç»ã
Object.isSealed()
å¤æå¯¹è±¡æ¯å¦å·²ç»å°éã
Object.keys()
è¿åä¸ä¸ªå 嫿æç»å®å¯¹è±¡èªæå¯æä¸¾åç¬¦ä¸²å±æ§åç§°çæ°ç»ã
Object.preventExtensions()
鲿¢å¯¹è±¡ç任使©å±ã
Object.seal()
鲿¢å ¶ä»ä»£ç å é¤å¯¹è±¡ç屿§ã
Object.setPrototypeOf()
设置对象çååï¼å³å
é¨ [[Prototype]]
屿§ï¼ã
Object.values()
è¿åå å«ç»å®å¯¹è±¡ææèªæå¯æä¸¾åç¬¦ä¸²å±æ§çå¼çæ°ç»ã
è¿äºå±æ§å¨ Object.prototype
ä¸å®ä¹ï¼è¢«ææ Object
å®ä¾æå
±äº«ã
Object.prototype.__proto__
å·²å¼ç¨
æåå®ä¾å¯¹è±¡å¨å®ä¾åæ¶ä½¿ç¨çåå对象ã
Object.prototype.constructor
å建该å®ä¾å¯¹è±¡çæé 彿°ãå¯¹äºæ®éç Object
å®ä¾ï¼åå§å¼ä¸º Object
æé 彿°ãå
¶å®æé 彿°çå®ä¾é½ä¼ä»å®ä»¬åèªç Constructor.prototype
对象ä¸ç»§æ¿ constructor
屿§ã
Object.prototype.__defineGetter__()
å·²å¼ç¨
å°ä¸ä¸ªå±æ§ä¸ä¸ä¸ªå½æ°ç¸å ³èï¼å½è¯¥å±æ§è¢«è®¿é®æ¶ï¼æ§è¡è¯¥å½æ°ï¼å¹¶ä¸è¿å彿°çè¿åå¼ã
Object.prototype.__defineSetter__()
å·²å¼ç¨
å°ä¸ä¸ªå±æ§ä¸ä¸ä¸ªå½æ°ç¸å ³èï¼å½è¯¥å±æ§è¢«è®¾ç½®æ¶ï¼æ§è¡è¯¥å½æ°ï¼æ§è¡è¯¥å½æ°å»ä¿®æ¹æä¸ªå±æ§ã
Object.prototype.__lookupGetter__()
å·²å¼ç¨
è¿åç»å®å¨æå®å±æ§ä¸ç getter 彿°ã
Object.prototype.__lookupSetter__()
å·²å¼ç¨
è¿åç»å®å¨æå®å±æ§ä¸ç setter 彿°ã
Object.prototype.hasOwnProperty()
è¿åä¸ä¸ªå¸å°å¼ï¼ç¨äºè¡¨ç¤ºä¸ä¸ªå¯¹è±¡èªèº«æ¯å¦å 嫿å®ç屿§ï¼è¯¥æ¹æ³å¹¶ä¸ä¼æ¥æ¾ååé¾ä¸ç»§æ¿æ¥ç屿§ã
Object.prototype.isPrototypeOf()
è¿åä¸ä¸ªå¸å°å¼ï¼ç¨äºè¡¨ç¤ºè¯¥æ¹æ³æè°ç¨ç对象æ¯å¦å¨æå®å¯¹è±¡çååé¾ä¸ã
Object.prototype.propertyIsEnumerable()
è¿åä¸ä¸ªå¸å°å¼ï¼æç¤ºæå®å±æ§æ¯å¦æ¯å¯¹è±¡çå¯æä¸¾èªæå±æ§ã
Object.prototype.toLocaleString()
è°ç¨ toString()
æ¹æ³ã
Object.prototype.toString()
è¿åä¸ä¸ªä»£è¡¨è¯¥å¯¹è±¡çå符串ã
Object.prototype.valueOf()
è¿åæå®å¯¹è±¡çåºæ¬ç±»åå¼ã
以ä¸ç¤ºä¾ä½¿ç¨å¸¦æä¸ååæ°ç new
å
³é®åå建空对象ï¼
const o1 = new Object();
const o2 = new Object(undefined);
const o3 = new Object(null);
ä½¿ç¨ Object
çæå¸å°å¯¹è±¡
ä¸é¢çä¾åå° Boolean
对象åå° o
ä¸ï¼
// çä»·äº const o = new Boolean(true);
const o = new Object(true);
// çä»·äº const o = new Boolean(false);
const o = new Object(Boolean());
Object prototype
彿们è¦ä¿®æ¹ç°æç Object.prototype
æ¹æ³æ¶ï¼è¯·ä½ èèä¸ä¸å¨ç°æé»è¾ä¹åæè
ä¹åéè¿å
è£
æ©å±ä»£ç çæ¹å¼æ¥æ³¨å
¥ä»£ç ãä¾å¦ï¼ä»¥ä¸ï¼æªç»æµè¯çï¼ä»£ç å°ä¼å¨æ§è¡å
é¨é»è¾æè
æ¯å
¶ä»æ©å±ä¹åï¼ææ¡ä»¶å°æ§è¡ä¸æ®µèªå®ä¹çé»è¾ã
å¨ä½¿ç¨é©åä¿®æ¹ååæ¶ï¼éè¿å¨å½æ°ä¸è°ç¨ apply()
æ¹æ³å¹¶ä¼ é this
ååæ°ï¼å³è°ç¨ç¶æï¼ï¼å°å
¶ä¼ éç»å½åè¡ä¸ºãè¿ç§æ¨¡å¼å¯ä»¥ç¨äºä»»ä½ååï¼ä¾å¦ Node.prototype
ãFunction.prototype
çã
const current = Object.prototype.valueOf;
// ç±äºæç屿§â-prop-valueâæ¯æ¨ªè·¨å¤ä¸ªååé¾çï¼å¹¶ä¸ä¸æ»æ¯å¨åä¸ä¸ªååé¾ä¸ï¼
// å æ¤ææ³ä¿®æ¹ Object.prototypeï¼
Object.prototype.valueOf = function (...args) {
if (Object.hasOwn(this, "-prop-value")) {
return this["-prop-value"];
} else {
// è¿ä¼¼ä¹ä¸æ¯æç对象ï¼å æ¤è®©æä»¬å°½å¯è½å®ç°é»è®¤è¡ä¸ºã
// 卿äºå
¶ä»è¯è¨ä¸ï¼apply çè¡ä¸ºç±»ä¼¼äº "super"ã
// å³ä½¿ valueOf() ä¸éè¦åæ°ï¼ä½å
¶ä»çæ¹æ³å¯è½éè¦åæ°ã
return current.apply(this, args);
}
};
è¦åï¼ ä¿®æ¹ä»»ä½å
ç½®æé 彿°ç prototype
屿§è¢«è®¤ä¸ºæ¯ä¸ç§ä¸å¥½çåæ³ï¼å¯è½ä¼å½±åååå
¼å®¹æ§ã
ä½ å¯ä»¥é 读æ´å¤å ³äºååçå 容ï¼åè§ç»§æ¿ä¸ååé¾ã
è§è æµè§å¨å ¼å®¹æ§ åè§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