Object.defineProperty()
给一个对象设置新的属性,或者修改属性。
兼容性:
IE9+,IE8中只能用在DOM对象上。
用法:
Object.defineProperty(obj, prop, descriptor)
const object1 = {}; Object.defineProperty(object1, 'property1', { value: 42, writable: false }); object1.property1 = 77;//严格模式下会报错 console.log(object1.property1); // 42
proxy
为一个对象设置代理,这个代理为这个对象的方法设置拦截并进行处理。
兼容:
IE不支持
基础用法:
有两个参数,target 目标对象,handler 处理方法。
const proxy1 = new Proxy(target, handler);
重置目标对象的 get 方法
const target = { message1: "hello", message2: "everyone" }; const handler3 = { get: function (target, prop, receiver) { if (prop === "message2") { return "world"; } return Reflect.get(...arguments); }, }; const proxy3 = new Proxy(target, handler3); console.log(proxy3.message1); // hello console.log(proxy3.message2); // world
在 JavaScript 对象中可以完全复制所有属性,但对浏览器dom对象不起作用。
const target = {}; const p = new Proxy(target, {}); p.a = 37; console.log(target.a); // 37 // 目标对象被修改了
可以在 proxy 中进行验证
let validator = { set: function(obj, prop, value) { if (prop === 'age') { if (!Number.isInteger(value)) { throw new TypeError('The age is not an integer'); } if (value > 200) { throw new RangeError('The age seems invalid'); } } // 设置value值 obj[prop] = value; // 返回成功 return true; } }; const person = new Proxy({}, validator); person.age = 100; console.log(person.age); // 100 person.age = 'young'; // Throws an exception person.age = 300; // Throws an exception
DOM操作
let view = new Proxy( { selected: null // target }, {// handler set: function(obj, prop, newval) { let oldval = obj[prop]; if (prop === 'selected') { if (oldval) { oldval.setAttribute('aria-selected', 'false'); } if (newval) { newval.setAttribute('aria-selected', 'true'); } } // 修改属性值 obj[prop] = newval; // 返回成功 return true; } }); let i1 = view.selected = document.getElementById('item-1'); //i1 是 null console.log(i1.getAttribute('aria-selected')); // 'true' let i2 = view.selected = document.getElementById('item-2'); console.log(i1.getAttribute('aria-selected')); // 'false' console.log(i2.getAttribute('aria-selected')); // 'true' Note: even if selected: !null, then giving oldval.setAttribute is not a function
Reflect
Reflect 是内置的,不可修改,提供了拦截javascript操作的方法。Reflect的所有属性和方法都是静态的。其中的一些方法与 Object 的方法相同。
和 Proxy 配合使用,例如访问对象的 set、deleteProperty 等方法,返回true/false;get 方法,返回属性的值。
WeakMap
WeakMap
对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。
Object.create()
创建一个新对象。
浏览器支持:
IE9
用法:
Object.create(proto, [propertiesObject])
const person = {
isHuman: false,
printIntroduction: function() {
console.log(My name is ${this.name}. Am I human? ${this.isHuman}
);
}
};
const me = Object.create(person);
me.name = 'Matthew'; // 修改了"me"的"name",没有修改 "person"的
me.isHuman = true; // 继承属性可以被重写
me.printIntroduction();
// "My name is Matthew. Am I human? true"
Object.getOwnPropertyDescriptor()
返回一个对象,描述目标对象的一个属性。
兼容性:
IE9+,IE8中只能用在DOM对象上。
用法:
Object.getOwnPropertyDescriptor(obj, prop)
const object1 = { property1: 42 }; const descriptor1 = Object.getOwnPropertyDescriptor(object1, 'property1'); console.log(descriptor1.configurable); // true console.log(descriptor1.value); // 42
相关链接:
参考: