ES6 Proxy的进修与明白

题目

前一段时间在字节跳动时聊到了Proxy。原由是问道Vue中数据绑定的完成,回复经由过程设置setter和getter完成,问如许有什么瑕玷,答在对对象的属性的监控方面存在瑕疵,比方经由过程直接设置数组下标举行赋值,或许对对象直接举行修正,是没法观察到的,必需运用Vue.set增加,或许运用Array.prototype.push等要领。
面试官引见说在Vue3中已经由过程Proxy处理了这个题目。Proxy是ES6中增加的内置对象,和Reflect合营功用非常壮大。恰好本日看到一个题目

明白

依据MDN的文档,Proxy是对原对象的包装。能够包装的内容包含一系列get、set等,值得注意的是getPrototypeOf同样是一种能够阻拦的操纵。同时,关于未定义的操纵坚持原效果。
在instanceof的页面,能够看到以下示例

function C() {}
function D() {}

var o = new C();

// true, because: Object.getPrototypeOf(o) === C.prototype
o instanceof C;

那末,在上面那个题目中,既然未定义proxy的getPrototypeOf,那它就该与原对象坚持一致。运用以下代码举行考证:

Object.getPrototypeOf(proxy) === Array.prototype //true

进一步思索

那末,是否是关于统统行动,在不做任何阻拦的情况下,就可以保证与目的对象的行动完全一致呢?很显然,这是不可能的。比方

a = {}
b = new Proxy(a, {})
console.log(a === b) //false

以及this的指向题目(案例来自阮一峰文章

const target = {
  m: function () {
    console.log(this === proxy);
  }
};
const handler = {};

const proxy = new Proxy(target, handler);

target.m() // false
proxy.m()  // true

虽然大部分情况下这应当不会成为大的停滞,但碰到毛病的时刻能够从这里入手寻觅题目。

    原文作者:hcfw007
    原文地址: https://segmentfault.com/a/1190000018175509
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞