题目
前一段时间在字节跳动时聊到了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
虽然大部分情况下这应当不会成为大的停滞,但碰到毛病的时刻能够从这里入手寻觅题目。