淺克隆this
var obj = { a: 1, b: 2, c: 3 } 方式一: var o = Object.assign({}, obj); 方式二: var {...o} = obj;
深克隆code
JSON.parse(JSON.stringify(obj))
freeze對象
淺凍結,屬性值不能修改,可是嵌套的引用類型不起做用 Object.freeze(obj); obj.a = 11 // 修改屬性無效
sealip
密封對象,不能添加和刪除屬性 Object.seal(obj); obj.d = 33; // 添加新屬性無效
只讀屬性get
var obj = { a: 1, b: 2 } Object.defineProperty(obj, "c", {value: 3, writable: false}); obj.c = 4; // 無效 console.log(obj.c);
不可枚舉屬性string
var obj = { a: 1, b: 2 } Object.defineProperty(obj, "c", {value: 3, enumerable: false}); for(let item in obj) { console.log(obj[item]); // 1 2 }
不可從新配置屬性it
var obj = { a: 1, b: 2 } Object.defineProperty(obj, "c", {value: 3, enumerable: false, configurable: false}); Object.defineProperty(obj, "c", {value: 3, enumerable: true}); // 報錯
讀取屬性的配置信息io
var obj = { a: 1, b: 2 } Object.defineProperty(obj, "c", {value: 3, enumerable: false, configurable: false}); console.log(Object.getOwnPropertyDescriptor(obj, "c")); 輸出信息 { value: 3, writable: false, enumerable: false, configurable: false }
get和setconsole
var obj = { a: 1, b: 2 } Object.defineProperty(obj, "bb", { get: function() { console.log("取值"); return this.b; }, set: function(value) { console.log("賦值", value); this.b=value; } }); obj.bb=1; // 賦值 1 console.log(obj.bb);