Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我不能将Symbol.hasInstance分配给函数?_Javascript_Symbols - Fatal编程技术网

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

Javascript 为什么我不能将Symbol.hasInstance分配给函数?,javascript,symbols,Javascript,Symbols,我有以下代码: function A() { } A[Symbol.hasInstance] = function(i) {return true} 在my Webpack+Babel环境中出现错误,导致失败: Uncaught TypeError: Cannot assign to read only property 'Symbol(Symbol.hasInstance)' of function 'function A() {}' 为什么?原因是Function.prototype[

我有以下代码:

function A() {
}

A[Symbol.hasInstance] = function(i) {return true}
在my Webpack+Babel环境中出现错误,导致失败:

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

为什么?

原因是
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}
})

相关:它看起来像是
Symbol。hasInstance
现在除了Firefox 50之外没有在任何东西中实现。@naomik
Symbol.hasInstance
似乎是在Chrome中实现的(我在Chrome stable v51上)。我可以在控制台上看到它<代码>函数A(){};[Symbol.hasInstance]=function(){}在控制台中工作。也许这是网页/巴别塔透明的问题?