Proxy 和 DefineProperty 区别

48 days ago

Proxy

让我们看一下MDN官网对其如何解释的。

image.png

请注意两个关键词:基本操作、拦截和自定义。

由此引出,什么是对象基本操作?

假设现在有一个对象const obj = {};
此时我们可以对其进行如下操作:

const obj = {};
obj.a = 3;
console.log(obj.a);
Object.setPrototypeOf(obj, { a: 3 });
Object.getPrototypeOf(obj);

for (const key in obj) {
  // ...
}

上面所有一系列操作,最终在运行时内部会转换成针对这个对象的一个基本操作

// 比如:
obj.a = 3; 会调用 [[Set]]
obj.a;     会调用 [[Get]]
Object.setPrototypeOf(obj, { a: 3 }); // [[SetPrototypeOf]]
Object.getPrototypeOf(obj); // [[GetPrototypeOf]]
// [[getOwnPropertyKeys]]
for (const key in obj) {
  // ...
}

我们可以参考ecma262这篇文档。上面罗列了对象所有的内部方法,即基本操作。

image.png

DefineProperty

让我们回顾上一张图片中表格里的[[DefineOwnProperty]],相信你已经明白了。

Object.defineProperty() 其实调用的是 [[DefineOwnProperty]]这个基本操作。

区别

因此可以很容易得出两者区别:

  1. Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。
  2. defineProperty 无法拦截任何,只是基本操作之一。最多也是对现有对象的一个拦截而已,而且是不全面的。

Comments

Sign in to leave a comment

Latest

No comments yet