我正在尝试解决最近出现的一个问题。
假设我们想要并且知道如何在 javascript 中使用动态 getter 和 setter,就像 php 中的那样 (__get, __set)。但由于 javascript 没有包罗万象的属性,我们唯一能做的就是提供可能的键列表,并迭代仅在这些键上添加 getter 和 setter,并希望不会出现其他键。
但问题到目前为止还没有解决。所以我想到的下一个方法是使用一个令人讨厌的黑客try
and catch
,因此任何时候在对象中未定义名称时都可以使用catch
作为一个吸气剂(至少),然后恢复代码,这是一件困难而且可能毫无意义的事情。但从这里开始我的第二个问题,在这样的使用中:
console.log(g.someundefinedproperty);
结果会是一个电话console.log
显示undefined
无一例外地被抛出。
然后我想到:如果我使用原来的呢?window.undefined
getter 和 setter,毕竟每次我搞砸并拼错单词或其他东西时都必须调用它。
所以我尝试了
Object.defineProperty(window, 'undefined', {
get : function ()
{
// functional code, including getting the caller and figuring out
// where we are, and what we have to do... easy :D
console.log('works');
},
set : function ()
{
// some couple more fine hacks here
console.log('this too');
}
});
但不幸的是undefined
窗口的属性是configurable : false
。
其他尝试过的黑客行为是克隆window
对象除了undefined
和内在window
财产。并在新对象上定义新的undefined
(请注意讽刺)然后window = mybetterwindow
;
由于这没有引起任何问题,我的希望很高,但系统再次让我失望window
根据设计,不能被覆盖。
我猜测它有自己的吸气剂,并且它根据中找到的原型重新实例化自己window.prototype
甚至更好Window.prototype
(注意大写)。
作为这个实验的最后一步,我重新定义了undefined
在这个原型上运行。无济于事,没有任何改变......我尝试创建一个new Window()
, but Window
不是构造函数,失败!
由于我已经没有想法了,所以我发现自己正在写这篇寻求帮助的文章。
如果您对如何解决动态 getter 和 setter 问题有任何想法,(the existencial problem of life, universe and everything else
),以一种不会以任何方式修改...我使用对象的方式(并且作为奖励,它不会need to break
a hole
in the fabric of time and space
)或语法,我恳求你说话,否则永远保持沉默:)。