为什么我不能将Symbol.hasInstance分配给函数?

时间:2016-08-15 22:28:20

标签: javascript symbols

我有以下代码:

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() {}'

为什么?

1 个答案:

答案 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}
})