老师,我这里换成判断string,然后push就会报length错,如果换成number,push就不报错,为什么呢
来源:3-14 代理Proxy(上)
灿烂__
2020-05-26
let arr2 = []
arr2 = new Proxy(arr2, {
set(target, prop, val) {
if (typeof val === 'string') { // number不报错
target[prop] = val
return true
} else {
return false
}
}
})
arr2.push("abc")
/** VM1553:1 Uncaught TypeError: 'set' on proxy: trap returned falsish for property 'length'
at Proxy.push (<anonymous>)
at <anonymous>:1:6
**/
写回答
1回答
-
谢成
2020-05-26
这个问题在阮一峰老师的书里其实也提到过:https://es6.ruanyifeng.com/#docs/proxy
我们再来看一下ecma的官方文档是怎么写的:http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver
所以我觉得,虽然说set方法需要返回一个布尔型的值,但经过测试发现应该是只能return true,如果return false就会报错,所以我觉得改成这样写可能会好一些:
也就是当传入的参数不符合判断的时候,我们就抛出一个异常,这个异常其实只是告诉调用者参数传的不正确,也可以不抛出异常,因为else中没有赋值语句所以也就不会赋值成功。但整个还是得返回true。
10
相似问题