Baseline Widely available
对象åå§å卿¯ä¸ä¸ªç¨å¤§æ¬å·ï¼{}
ï¼æ¬èµ·æ¥ç以éå·åéçå表ï¼å
å«äºä¸ä¸ªå¯¹è±¡çé¶ä¸ªæå¤ä¸ªå±æ§åç§°åç¸å
³å¼ãå¯ä»¥éè¿ Object.create()
æ¹æ³ï¼æè
ä½¿ç¨ new
è¿ç®ç¬¦è°ç¨å
¶æé 彿°èåå§åä¸ä¸ªå¯¹è±¡ã
const object1 = { a: "foo", b: 42, c: {} };
console.log(object1.a);
// Expected output: "foo"
const a = "foo";
const b = 42;
const c = {};
const object2 = { a: a, b: b, c: c };
console.log(object2.b);
// Expected output: 42
const object3 = { a, b, c };
console.log(object3.a);
// Expected output: "foo"
è¯æ³
o = {
a: "foo",
b: 42,
c: {},
1: "number literal property",
"foo:bar": "string literal property",
shorthandProperty,
method(parameters) {
// â¦
},
get property() {},
set property(value) {},
[expression]: "computed property",
__proto__: prototype,
...spreadProperty,
};
æè¿°
对象åå§å卿¯ä¸ä¸ªæè¿° Object
åå§åç表达å¼ã对象ç±ç¨äºæè¿°å¯¹è±¡ç屿§ç»æãå¯¹è±¡å±æ§çå¼å¯ä»¥å
å«åºæ¬æ°æ®ç±»åæå
¶ä»å¯¹è±¡ã
对象åé¢çè¯æ³ä¸ JavaScript Object Notationï¼JSONï¼ä¸ä¸æ ·ãè½ç¶å®ä»¬çèµ·æ¥å¾ç¸ä¼¼ï¼ä½å®ä»¬ä¹é´è¿æ¯æåºå«çï¼
"property": value
çè¯æ³è¿è¡å±æ§å®ä¹ã屿§åå¿
é¡»æ¯åå¼å·ï¼èä¸å®ä¹ä¸è½ç®åã计ç®å±æ§å乿¯ä¸å
许çãtrue
ãfalse
ãnull
ãæ°ç»æå
¶ä» JSON 对象ãè¿æå³ç JSON ä¸è½è¡¨è¾¾æ¹æ³æéæ®é对象ï¼å¦ Date
æ RegExp
ã"__proto__"
æ¯ä¸ä¸ªæ®éç屿§é®ãå¨å¯¹è±¡åé¢ä¸ï¼å®è®¾ç½®å¯¹è±¡çååãJSON æ¯å¯¹è±¡åé¢è¯æ³çä¸ä¸ªçåéï¼æå³çæ¯ä¸ä¸ªææç JSON ææ¬é½å¯ä»¥è¢«è§£æä¸ºå¯¹è±¡åé¢ï¼å¹¶ä¸ä¸ä¼å¼èµ·è¯æ³é误ãå¯ä¸çä¾å¤æ¯ï¼å¯¹è±¡åé¢è¯æ³ç¦æ¢éå¤ç __proto__
é®ï¼è¿ä¸éç¨äº JSON.parse()
ãåè
å° __proto__
åæ®éç屿§ä¸æ ·å¯¹å¾
ï¼å¹¶å°æå䏿¬¡åºç°ç对象ä½ä¸ºè¯¥å±æ§çå¼ãå®ä»¬æä»£è¡¨ç对象å¼ï¼ä¹å°±æ¯å®ä»¬çè¯ä¹ï¼å¯ä¸ä¸åçæ¶åï¼ä¹å°±æ¯å½æºç å
å« __proto__
é®çæ¶åââ对äºå¯¹è±¡åé¢ï¼å®è®¾ç½®å¯¹è±¡çååï¼å¯¹äº JSONï¼å®æ¯ä¸ä¸ªæ®éç屿§ã
console.log(JSON.parse('{ "__proto__": 0, "__proto__": 1 }')); // {__proto__: 1}
console.log({ "__proto__": 0, "__proto__": 1 }); // SyntaxError: Duplicate __proto__ fields are not allowed in object literals
console.log(JSON.parse('{ "__proto__": {} }')); // { __proto__: {} }
console.log({ "__proto__": {} }); // {}ï¼å
¶åå为 {}ï¼
ç¤ºä¾ å建对象
没æå±æ§ç空对象å¯ä»¥ç¨ä»¥ä¸æ¹å¼å建ï¼
åé¢åå§åå¨ç¬¦å·çä¼å¿å¨äºè½å¤å¿«éå建带æå¤§æ¬å·å
屿§ç对象ï¼å¯ä»¥å¿«éè®°å½ä¸ä¸ä¸ªä»¥éå·åéç key: value
对çå表ã
å¦ä¸ä»£ç å建äºä¸ä¸ªå«ä¸ä¸ªå±æ§ç对象ï¼é®åå«ä¸º "foo"
ã"age"
å "baz"
ãè¿äºé®å¯¹åºçå¼ï¼å嫿¯å符串 "bar"
ï¼æ°å 42
åå¦ä¸ä¸ªå¯¹è±¡ã
const object = {
foo: "bar",
age: 42,
baz: { myProp: 12 },
};
访é®å±æ§
å建对象åï¼å¯ä»¥è¯»åæè ä¿®æ¹å®ãå¯¹è±¡å±æ§å¯ä»¥ç¨ä¸æ å°åç¹æ è®°æè æ¹æ¬å·æ 记访é®ãåè§å±æ§è®¿é®å¨è·åæ´å¤ä¿¡æ¯ã
object.foo; // "bar"
object["age"]; // 42
object.baz; // {myProp: 12}
object.baz.myProp; //12
屿§å®ä¹
ä¸é¢å¦ä¹ äºå¦ä½ç¨åå§åè¯æ³å¯¹è±¡å±æ§ãç»å¸¸è½éå°å¸æå°ä»£ç ä¸çåéæ¾å°å¯¹è±¡ä¸çæ åµãå¯è½éå°å¦ä¸ä»£ç ï¼
const a = "foo";
const b = 42;
const c = {};
const o = {
a: a,
b: b,
c: c,
};
ææ´ç®ççæ è®°å¯ä»¥å®ç°åæ ·çææï¼
const a = "foo";
const b = 42;
const c = {};
// ç®å屿§å
const o = { a, b, c };
// ä¹å°±æ¯è¯´ï¼
console.log(o.a === { a }.a); // true
éå¤å±æ§å
屿§ä½¿ç¨äºåæ ·çåç§°æ¶ï¼åé¢ç屿§ä¼è¦çåé¢ç屿§ã
const a = { x: 1, x: 2 };
console.log(a); // {x: 2}
å¨ ES2015 ä¹åï¼ä»»ä½å°æ¹é½å 许éå¤å±æ§ååºç°ï¼ä¹å æ¬ä¸¥æ ¼æ¨¡å¼ãä½ ä¹å¯ä»¥å¨ç±»ä¸ä½¿ç¨éå¤ç屿§åãå¯ä¸çä¾å¤æ¯ç§æå ç´ ï¼å¨æ´ä¸ªç±»ä¸å®å¿ é¡»æ¯å¯ä¸çã
æ¹æ³å®ä¹å¯¹è±¡å±æ§ä¹å¯ä»¥æ¯ä¸ä¸ªå½æ°ãgetter æ setter æ¹æ³ã
const o = {
property: function (parameters) {},
get property() {},
set property(value) {},
};
åå¨ä¸ç§æ´ç®ççåæ³ï¼å
³é®å function
ä¹å¯ä»¥çç¥ã
// ç®å屿§å
const o = {
property(parameters) {},
};
ä¹å¯ä»¥ç®çå°å®ä¹çæå¨æ¹æ³ã
const o = {
*generator() {
// â¦
},
};
è¿ç¸å½äºè¿ä¸ªç±»ä¼¼ ES5 ç符å·ï¼ä½æ³¨æ ECMAScript 5 没æçæå¨ï¼ï¼
const o = {
generator: function* () {
// â¦
},
};
æå ³æ¹æ³çæ´å¤ä¿¡æ¯åä¾åï¼è¯·åè§æ¹æ³å®ä¹ã
计ç®å±æ§å对象åå§åå¨çè¯æ³ä¹æ¯æè®¡ç®ç屿§åç§°ãè¿å
è®¸ä½ æä¸ä¸ªè¡¨è¾¾å¼æ¾å¨ä¸æ¬å· []
ä¸ï¼å®å°è¢«è®¡ç®å¹¶ä½ä¸ºå±æ§å使ç¨ãè¿è®©äººæ³èµ·å±æ§è®¿é®å¨è¯æ³ä¸çæ¬å·ç¬¦å·ï¼ä½ å¯è½å·²ç»ç¨å®æ¥è¯»ååè®¾ç½®å±æ§ã
ç°å¨ä½ ä¹å¯ä»¥å¨å¯¹è±¡åé¢éä¸ä½¿ç¨ç±»ä¼¼çè¯æ³ï¼
// 计ç®å±æ§å
let i = 0;
const a = {
[`foo${++i}`]: i,
[`foo${++i}`]: i,
[`foo${++i}`]: i,
};
console.log(a.foo1); // 1
console.log(a.foo2); // 2
console.log(a.foo3); // 3
const items = ["A", "B", "C"];
const obj = {
[items]: "Hello",
};
console.log(obj); // A,B,C: "Hello"
console.log(obj["A,B,C"]); // "Hello"
const param = "size";
const config = {
[param]: 12,
[`mobile${param.charAt(0).toUpperCase()}${param.slice(1)}`]: 4,
};
console.log(config); // {size: 12, mobileSize: 4}
æ©å±å±æ§
对象åé¢éæ¯ææ©å±è¯æ³ãå®å°èªå·±æä¾ç对象çæä¸¾å±æ§å¤å¶å°ä¸ä¸ªæ°ç对象ä¸ã
ç°å¨å¯ä»¥ä½¿ç¨æ¯ Object.assign()
æ´ççè¯æ³æ¥å®ç°æµ
æ·è´ï¼ä¸å
æ¬ prototype
ï¼æå并对象ã
const obj1 = { foo: "bar", x: 42 };
const obj2 = { foo: "baz", y: 13 };
const clonedObj = { ...obj1 };
// { foo: "bar", x: 42 }
const mergedObj = { ...obj1, ...obj2 };
// { foo: "baz", x: 42, y: 13 }
è¦åï¼ è¯·æ³¨æï¼Object.assign()
ä¼è§¦å setterï¼èå±å¼è¯æ³ä¸ä¼ï¼
ä¸ä¸ªå½¢å¼ä¸º __proto__: value
æ "__proto__": value
ç屿§å®ä¹å¹¶æ²¡æå建ä¸ä¸ªå称为 __proto__
ç屿§ãç¸åï¼å¦ææä¾ç弿¯ä¸ä¸ªå¯¹è±¡æ null
å¼ï¼å®å°å建对象ç [[Prototype]]
æå该å¼ï¼å¦æè¯¥å¼ä¸æ¯ä¸ä¸ªå¯¹è±¡æ null
ï¼è¯¥å¯¹è±¡ä¸ä¼è¢«æ¹åï¼ã
请注æï¼__proto__
鮿¯æ ååçè¯æ³ï¼ä¸éæ å䏿§è½ä¸ä½³ç Object.prototype.__proto__
访é®å¨ä¸åãå®å¨å建对象æ¶è®¾ç½®äº [[Prototype]]
ï¼ç±»ä¼¼äº Object.create
ââè䏿¯åæ´ååé¾ã
const obj1 = {};
console.log(Object.getPrototypeOf(obj1) === Object.prototype); // true
const obj2 = { __proto__: null };
console.log(Object.getPrototypeOf(obj2)); // null
const protoObj = {};
const obj3 = { "__proto__": protoObj };
console.log(Object.getPrototypeOf(obj3) === protoObj); // true
const obj4 = { __proto__: "not an object or null" };
console.log(Object.getPrototypeOf(obj4) === Object.prototype); // true
console.log(Object.hasOwn(obj4, "__proto__")); // false
å¨å¯¹è±¡åé¢å¼ä¸ï¼ä» å 许æä¸ä¸ªåå setterï¼å¤ä¸ªåå setter ä¼è¢«è§ä¸ºè¯æ³é误ã
ä¸ä½¿ç¨âåå·âæ è®°æ³ç屿§å®ä¹ä¸æ¯åå setterãå®ä»¬æ¯å±æ§å®ä¹ï¼å ¶è¡ä¸ºä¸ä½¿ç¨ä»»ä½å ¶ä»åç§°ç类似å®ä¹ç¸åã
const __proto__ = "variable";
const obj1 = { __proto__ };
console.log(Object.getPrototypeOf(obj1) === Object.prototype); // true
console.log(Object.hasOwn(obj1, "__proto__")); // true
console.log(obj1.__proto__); // "variable"
const obj2 = { __proto__() { return "hello"; } };
console.log(obj2.__proto__()); // "hello"
const obj3 = { ["__proto__"]: 17 };
console.log(obj3.__proto__); // 17
// å°åå setter 䏿£å¸¸ç使ç¨â__proto__âé®çèªæå±æ§æ··åå¨ä¸èµ·
const obj4 = { ["__proto__"]: 17, __proto__: {} }; // {__proto__: 17} ï¼åå为 {}ï¼
const obj5 = {
["__proto__"]: 17,
__proto__: {},
__proto__: null, // SyntaxError: Duplicate __proto__ fields are not allowed in object literals
};
const obj6 = {
["__proto__"]: 17,
["__proto__"]: "hello",
__proto__: null,
}; // {__proto__: "hello"}ï¼åå为 nullï¼
const obj7 = {
["__proto__"]: 17,
__proto__,
__proto__: null,
}; // {__proto__: "variable"}ï¼åå为 nullï¼
è§è æµè§å¨å
¼å®¹æ§ åè§
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