Baseline Widely available
Object.freeze()
éææ¹æ³å¯ä»¥ä½¿ä¸ä¸ªå¯¹è±¡è¢«å»ç»ãå»ç»å¯¹è±¡å¯ä»¥é²æ¢æ©å±ï¼å¹¶ä½¿ç°æç屿§ä¸å¯åå
¥åä¸å¯é
ç½®ã被å»ç»ç对象ä¸è½åè¢«æ´æ¹ï¼ä¸è½æ·»å æ°ç屿§ï¼ä¸è½ç§»é¤ç°æç屿§ï¼ä¸è½æ´æ¹å®ä»¬ç坿䏾æ§ãå¯é
ç½®æ§ãå¯åæ§æå¼ï¼å¯¹è±¡çååä¹ä¸è½è¢«éæ°æå®ãfreeze()
è¿åä¸ä¼ å
¥ç对象ç¸åç对象ã
å»ç»ä¸ä¸ªå¯¹è±¡æ¯ JavaScript æä¾çæé«å®æ´æ§çº§å«ä¿æ¤æªæ½ã
å°è¯ä¸ä¸const obj = {
prop: 42,
};
Object.freeze(obj);
obj.prop = 33;
// Throws an error in strict mode
console.log(obj.prop);
// Expected output: 42
è¯æ³ åæ°
obj
è¦å»ç»ç对象ã
ä¼ éç»å½æ°ç对象ã
æè¿°å»ç»ä¸ä¸ªå¯¹è±¡ç¸å½äºé»æ¢å
¶æ©å±ç¶åå°ææç°æå±æ§çæè¿°ç¬¦ç configurable
ç¹æ§æ´æ¹ä¸º false
ââå¯¹äºæ°æ®å±æ§ï¼å°åæ¶æ writable
ç¹æ§æ´æ¹ä¸º false
ãæ æ³å被å»ç»ç对象ç屿§ä¸æ·»å æå é¤ä»»ä½å
容ãä»»ä½è¿æ ·çå°è¯é½å°å¤±è´¥ï¼å¯è½æ¯éé»å¤±è´¥ï¼ä¹å¯è½æåºä¸ä¸ª TypeError
å¼å¸¸ï¼é常æ
åµä¸ï¼å¨ä¸¥æ ¼æ¨¡å¼ä¸æåºï¼ã
对äºè¢«å»ç»å¯¹è±¡çæ°æ®å±æ§ï¼å®ä»¬çå¼ä¸è½è¢«æ´æ¹ï¼å 为å®ä»¬ç writable
å configurable
ç¹æ§è¢«è®¾ç½®ä¸º false
ã访é®å¨å±æ§ï¼getter å setterï¼ä¹ç¸åââgetter è¿åç屿§å¼ä»ç¶å¯ä»¥æ´æ¹ï¼setter å¯ä»¥å¨è®¾ç½®å±æ§æ¶è°ç¨è䏿åºé误ã请注æï¼å¯¹è±¡ç±»åçå¼ä»ç¶å¯ä»¥ä¿®æ¹ï¼é¤éå®ä»¬ä¹è¢«å»ç»ãæ°ç»ä½ä¸ºä¸ç§å¯¹è±¡ä¹å¯ä»¥è¢«å»ç»ï¼æ°ç»è¢«å»ç»åï¼æ¢ä¸è½æ´æ¹å®çå
ç´ ï¼ä¹ä¸è½åæ°ç»ä¸æ·»å æå é¤å
ç´ ã
freeze()
è¿åä¼ éç»å½æ°çåä¸å¯¹è±¡ãå®ä¸ä¼å建ä¸ä¸ªè¢«å»ç»ç坿¬ã
å°è¯å»ç»å¸¦æå
ç´ ç TypedArray
æ DataView
ä¼å¯¼è´ TypeError
ï¼å 为å®ä»¬æ¯å
åè§å¾ï¼å¯è½ä¼å¼èµ·å
¶ä»é®é¢ï¼
Object.freeze(new Uint8Array(0)); // 没æå
ç´
// Uint8Array []
Object.freeze(new Uint8Array(1)); // æå
ç´
// TypeError: Cannot freeze array buffer views with elements
Object.freeze(new DataView(new ArrayBuffer(32))); // 没æå
ç´
// DataView {}
Object.freeze(new Float64Array(new ArrayBuffer(64), 63, 0)); // 没æå
ç´
// Float64Array []
Object.freeze(new Float64Array(new ArrayBuffer(64), 32, 2)); // æå
ç´
// TypeError: Cannot freeze array buffer views with elements
请注æï¼ç±äºæ åä¸çä¸ä¸ªå±æ§ï¼buf.byteLength
ãbuf.byteOffset
å buf.buffer
ï¼æ¯åªè¯»çï¼å°±å ArrayBuffer
æ SharedArrayBuffer
ç屿§ä¸æ ·ï¼ï¼å æ¤æ²¡æçç±å°è¯å»ç»è¿äºå±æ§ã
ä¸ Object.seal()
ä¸åï¼ä½¿ç¨ Object.freeze()
å»ç»ç对象ä¸çç°æå±æ§æ¯ä¸å¯åçï¼æ°æ®å±æ§ä¸è½è¢«éæ°èµå¼ã
const obj = {
prop() {},
foo: "bar",
};
// å»ç»åï¼å¯ä»¥æ·»å æ°å±æ§ï¼ä¹å¯ä»¥æ´æ¹æå é¤ç°æå±æ§
obj.foo = "baz";
obj.lumpy = "woof";
delete obj.prop;
// å»ç»ã
const o = Object.freeze(obj);
// è¿åå¼åæä»¬ä¼ å
¥ç对象ç¸åã
o === obj; // true
// 对象已å»ç»ã
Object.isFrozen(obj); // === true
// ç°å¨ä»»ä½æ´æ¹é½ä¼å¤±è´¥ã
obj.foo = "quux"; // éé»ä½ä»ä¹é½æ²¡å
// éé»ä¸æ²¡ææ·»å 屿§
obj.quaxxor = "the friendly duck";
// ä¸¥æ ¼æ¨¡å¼ä¸ï¼è¿æ ·çå°è¯ä¼æåº TypeError
function fail() {
"use strict";
obj.foo = "sparky"; // æåº TypeError
delete obj.foo; // æåº TypeError
delete obj.quaxxor; // è¿å trueï¼å ä¸ºå±æ§âquaxxorâ仿ªè¢«æ·»å è¿ã
obj.sparky = "arf"; // æåº TypeError
}
fail();
// å°è¯éè¿ Object.defineProperty æ´æ¹ï¼
// ä¸é¢ç两个è¯å¥é½ä¼æåº TypeErrorã
Object.defineProperty(obj, "ohai", { value: 17 });
Object.defineProperty(obj, "foo", { value: "eit" });
// åæ ·æ æ³æ´æ¹åå
// ä¸é¢ç两个è¯å¥é½ä¼æåº TypeErrorã
Object.setPrototypeOf(obj, { x: 20 });
obj.__proto__ = { x: 20 };
å»ç»æ°ç»
const a = [0];
Object.freeze(a); // æ°ç»ç°å¨å¼å§æ æ³è¢«ä¿®æ¹
a[0] = 1; // éé»å¤±è´¥
// ä¸¥æ ¼æ¨¡å¼ä¸ï¼è¿æ ·çå°è¯å°æåº TypeError
function fail() {
"use strict";
a[0] = 1;
}
fail();
// å°è¯å¨æ°ç»æ«å°¾è¿½å å
ç´
a.push(2); // æåº TypeError
被å»ç»ç对象æ¯ä¸å¯åçãä½ä¹ä¸æ»æ¯è¿æ ·ã以ä¸ç¤ºä¾æ¾ç¤ºè¢«å»ç»çå¯¹è±¡ä¸æ¯å¸¸éï¼æµ å»ç»ï¼ã
const obj1 = {
internal: {},
};
Object.freeze(obj1);
obj1.internal.a = "aValue";
obj1.internal.a; // 'aValue'
对äºä¸ä¸ªå¸¸éå¯¹è±¡ï¼æ´ä¸ªå¼ç¨å¾ï¼ç´æ¥åé´æ¥å¼ç¨å ¶ä»å¯¹è±¡ï¼åªè½å¼ç¨ä¸å¯åçå»ç»å¯¹è±¡ãå»ç»ç对象被认为æ¯ä¸å¯åçï¼å 为æ´ä¸ªå¯¹è±¡ä¸çæ´ä¸ªå¯¹è±¡ç¶æï¼å¯¹å ¶ä»å¯¹è±¡çå¼åå¼ç¨ï¼æ¯åºå®çãæ³¨æï¼åç¬¦ä¸²ãæ°ååå¸å°å¼æ»æ¯ä¸å¯åçï¼è彿°åæ°ç»æ¯å¯¹è±¡ã
ä»ä¹æ¯âæµ å»ç»âï¼è°ç¨ Object.freeze(object)
çç»æä»
éç¨äº object
æ¬èº«çç´æ¥å±æ§ï¼å¹¶ä¸åªä¼å¨ object
ä¸é²æ¢æªæ¥ç屿§æ·»å ãå é¤ï¼æéæ°èµå¼çæä½ã妿è¿äºå±æ§ç弿¬èº«æ¯å¯¹è±¡ï¼è¿äºå¯¹è±¡ä¸ä¼è¢«å»ç»ï¼å¹¶ä¸å¯è½æä¸ºå±æ§æ·»å ãå é¤ï¼æéæ°èµå¼æä½çç®æ ã
const employee = {
name: "Mayank",
designation: "Developer",
address: {
street: "Rohini",
city: "Delhi",
},
};
Object.freeze(employee);
employee.name = "Dummy"; // å¨éä¸¥æ ¼æ¨¡å¼ä¸éé»å¤±è´¥
employee.address.city = "Noida"; // å¯ä»¥ä¿®æ¹å对象ç屿§
console.log(employee.address.city); // "Noida"
为äºä½¿å¯¹è±¡ä¸å¯åï¼éè¦éå½å°å»ç»æ¯ä¸ªå¯¹è±¡ç±»åç屿§ï¼æ·±å»ç»ï¼ãå½ä¸ä»
å½ä½ ç¥é对象å¨å¼ç¨å¾ä¸ä¸å
å«å¾ªç¯å¼ç¨æ¶ï¼å¯ä»¥æ ¹æ®ä½ ç设计é个æ¡ä¾å°ä½¿ç¨è¯¥æ¨¡å¼ï¼å¦åä¼å¯¼è´æ é循ç¯ãdeepFreeze()
çä¸ä¸ªå¢å¼ºåè½æ¯æ·»å ä¸ä¸ªå
é¨å½æ°ï¼è¯¥å½æ°æ¥æ¶ä¸ä¸ªè·¯å¾ï¼ä¾å¦ä¸ä¸ªæ°ç»ï¼åæ°ï¼è¿æ ·å¯ä»¥å¨è°ç¨ deepFreeze()
éå½å°å»ç»å¯¹è±¡æ¶ï¼é¿å
å»ç»æ£å¨è¢«å¤çç对象ãä½ä»æå¯è½ä¼å»ç»ä¸åºè¯¥è¢«å»ç»ç对象ï¼ä¾å¦ window
ã
function deepFreeze(object) {
// è·å对象ç屿§å
const propNames = Reflect.ownKeys(object);
// å»ç»èªèº«åå
å»ç»å±æ§
for (const name of propNames) {
const value = object[name];
if ((value && typeof value === "object") || typeof value === "function") {
deepFreeze(value);
}
}
return Object.freeze(object);
}
const obj2 = {
internal: {
a: null,
},
};
deepFreeze(obj2);
obj2.internal.a = "anotherValue"; // éä¸¥æ ¼æ¨¡å¼ä¸ä¼éé»å¤±è´¥
obj2.internal.a; // 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