我有以下代码:
function A() {
}
A[Symbol.hasInstance] = function(i) {return true}
在我的Webpack + Babel环境中失败并出现错误:
Uncaught TypeError: Cannot assign to read only property 'Symbol(Symbol.hasInstance)' of function 'function A() {}'
为什么?
答案 0 :(得分:1)
原因是因为Function.prototype[Symbol.hasInstance]
的属性描述符具有{writable: false}
,这使得无法以这种方式进行分配。 JS引擎查找Function.prototype[Symbol.hasInstance]
描述符,看到writable: false
,然后禁止赋值,即使它是在原型类型的叶对象上分配,而不是在找到属性的原始对象上,或者换句话说,writable: false
属性是原型继承的,即使该属性尚未存在于我们尝试赋值的原型链的最叶子对象上。
要解决此问题,我们可以使用Object.defineProperty
,它可以正常使用:
function A() {
}
Object.defineProperty(A, Symbol.hasInstance, {
value: function(i) {return true}
})