窗口上的Javascript getters/ssetters
Javascript getters/setters on window
为什么下面的代码在firefox21.0中抛出TypeError?
Object.defineProperty(window,'windowProperty',{
get: function(){
return 'windowProperty'
},
set: function(val){
console.log('windowProperty is being set');
},
configurable: true,
});
var windowProperty;
但是在不使用var的情况下声明windowProperty有效:
windowProperty;
或
window.windowProperty;
这种行为也出现在蜘蛛侠身上:
var a=1;
Object.defineProperty(this,'a',{
get: function(){
return 'a';
},
});
只写
windowProperty;
不声明变量。它只是尝试在最接近的上下文中返回变量内容,如果找不到,则返回undefined
。这就像一项没有目标的任务。例如,您也可以在不抛出错误的情况下编写随机文本:
'Hello, world !';
123456;
undefined;
相反,使用var试图重新定义之前在代码中已经定义的属性,因此会出现错误。
编辑
正如simonzack所说,浏览器在重新定义变量时并不总是发送错误。例如:
var test; var test;
不会抛出这个错误(即使这是个坏主意,一些JS验证器会警告你) 然而,通过定义getter和setter,浏览器会"锁定"此属性(例如,为了防止冲突,同一属性上有两个不同的setter) 我的错,这是一种误解。
你想重新定义你的变量有什么原因吗?
编辑2
考虑到var
声明在defineProperty
之前,这使得我的解释更加精确。实际上,当您第一次使用var
声明时,浏览器会将其configurable
状态设置为false,从而阻止对其描述符进行更改(请参阅链接)。因此,当您尝试使用defineProperty
函数更改它时,会导致错误。一个更好的例子是将代码封装在闭包函数中。这样一来,var
定义的windowProperty就不一样了,一切都很好
(function () {
var windowProperty;
Object.defineProperty(...);
//It works because the previously defined variable is in the scope of the function and thus is not the same as window.windowProperty.
})();
相关文章:
- Google闭包和生成的getters/ssetter
- Can't get setters/getters to work
- 用一个数组应用Chai可链接的getters
- JavaScript Getters and Setters issue
- setters and getters in javascript
- Javascript Getters And Setters
- JS getters:定义属性替换或补充旧的内联“get”“set”语法
- 为什么使用访问器(getters 和 setters)
- Getters and setters in javascript
- Getters and Setters on angular.extend $scope
- Javascript OOP, getters, setters, run - D3.js - 通过选项设置使图形可重用
- 节点模块作为getters和setters提供
- 如何在handlers.js模板中使用getters
- 窗口上的Javascript getters/ssetters
- Getters and Setters in AngularJS
- JavaScript中的Getters和Setters(语法正确吗?)
- 将 Javascript getters/setter 复制到另一个原型对象
- 你能在Javascript代码中使用setters和getters吗?
- Javascript getters and setters - recursion issue