2016-08-15 57 views
0

我有以下代码:为什么我不能将Symbol.hasInstance分配给函数?

function A() { 
} 

A[Symbol.hasInstance] = function(i) {return true} 

它失败,错误在我的WebPack +通天环境:

Uncaught TypeError: Cannot assign to read only property 'Symbol(Symbol.hasInstance)' of function 'function A() {}' 

为什么?

+0

相关:它看起来像'Symbol.hasInstance'没有在任何实施Firefox除外50现在。 – naomik

+0

@naomik'Symbol.hasInstance'似乎在Chrome中实现(我在Chrome稳定版v51上)。我可以在控制台中看到它。 '函数A(){}; [Symbol.hasInstance] = function(){}'在控制台中工作。也许这是Webpack/Babel transpilation的问题? – trusktr

回答

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} 
}) 
相关问题