我在Float32Array中添加了3个名为'x','y'和'z'的属性。 getter在chrome和firefox中运行良好,但看起来setter只适用于chrome。这是为什么?这是一个错误吗?有没有办法让它在firefox中运行?
Object.defineProperty(Float32Array.prototype, 'x', {
get: function(){
return this[0];
},
set: function(x){
this[0] = x;
}
});
// creating a Float32Array-Vector using mjs.js
var vector = V3.$(1,2,3);
// works fine
document.writeln(vector.x);
// works in chrome but not in firefox
vector.x = vector.y + vector.z;
答案 0 :(得分:1)
我发现问题非常有趣并且已经研究过了。我能够重现你遇到的问题。永远不会调用setter但调用getter。在探索时,找到以下文字:
JavaScript 1.8.1 note
Starting in JavaScript 1.8.1, setters are no longer called when setting properties in object and array initializers.
查看网址:https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects
还有更多参考资料:https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.8.1
https://dev.mozilla.jp/localmdc/localmdc_11696.html
引用安全漏洞的原因(受影响的推特)
在铬here
答案 1 :(得分:0)
这里发生的事情是Firefox不允许在类型化数组上设置任何非数字属性;任何这样的集都会被忽略。在搜索原型链之前,它们被忽略了,这就是原型上的setter没有被调用的原因。
我不清楚这里的正确行为是什么;它在这方面改变了几次。