传入Object.setPrototypeOf()方法和Reflect.setPrototypeOf()方法的均是以上两个参数,另一方面,getPrototypeOf陷阱中的Object.getPrototypeOf()方法和Reflect.getPrototypeOf()方法只接受参数trapTarget。
原型代理陷阱的运行机制原型代理陷阱有一些限制。首先,getPrototypeOf陷阱必须返回对象或null,否则将导致运行时错误,返回值检查可以确保Object.getPrototypeOf()返回的总是预期的值;其次,在setPrototypeOf陷阱中,如果操作失败则返回的一定是false,此时Object.setPrototypeOf()会抛出错误,如果setPrototypeOf返回了任何不是false的值,那么Object.setPrototypeOf()便假设操作成功。
以下示例通过总是返回null,且不允许改变原型的方式隐藏了代理的原型:
1 let target = {};
2 let proxy = new Proxy(target, {
3 getPrototypeOf(trapTarget) {
4 returnnull;
5 },
6 setPrototypeOf(trapTarget, proto) {
7 returnfalse;
8 }
9 });
10 let targetProto = Object.getPrototypeOf(target);
11 let proxyProto = Object.getPrototypeOf(proxy);
12 console.log(targetProto ===Object.prototype); // => true
13 console.log(proxyProto ===Object.prototype); // => false
14 console.log(proxyProto); // => null
// 成功
15 Object.setPrototypeOf(target, {});
// 抛出错误
16 Object.setPrototypeOf(proxy, {});
代码强调了target和proxy的行为差异。Object.getPrototypeOf()给target返回的是值,而给proxy返回值时,由于getPrototypeOf陷阱被调用,返回的是null;同样,Object.setPrototypeOf()成功为target设置原型,而给proxy设置原型时,由于setPrototypeOf陷阱被调用,最终抛出一个错误。
一、 vue的$ref
一个对象,持有注册过 的所有 DOM 元素和组件实例。
ref 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例:
<!-- `vm.$refs.p` will be the DOM node -->
<p ref="p">hello</p>
<!-- `vm.$refs.child` will be the child component instance -->
<child-component ref="child"></child-component>
ref属性不是一个标准的HTML属性,只是Vue中的一个属性。实际上,它甚至不会是DOM的一部分,所以在浏览器中你查看渲染的HTML,你是看不到有关于ref的任何东西。因为在它前面没有添加:,而且它也不是一个指令
<div ref="demo"></div>
document.querySelector('[ref=demo]');