hel*_*y0d 6 javascript metaprogramming undefined getter-setter
我正在努力解决最近出现的问题.假设我们想要并且知道如何在javascript中使用动态getter和setter,更像是php(__ get,__ set)中的那些.但是由于javascript没有全能属性,我们唯一能做的就是提供一个可能的键列表,并迭代只在那些上添加getter和setter,并希望别人都不会来.
但问题到目前为止尚未解决.这样就使我想起了另一个方法是使用一个讨厌的黑客与try和catch,因此只要有一个名字会在一个对象是不确定的使用catch是获取(至少),然后恢复代码,硬,也许毫无意义的事做.但是从这里出现了我的第二个问题,在这样的用途:
console.log(g.someundefinedproperty);
Run Code Online (Sandbox Code Playgroud)
结果将是一个console.log显示的调用undefined,没有异常被抛出.然后它来找我:如果我会使用原始的window.undefinedgetter和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');
}
});
Run Code Online (Sandbox Code Playgroud)
但不幸的undefined是窗口的属性是configurable : false.尝试的其他黑客正在克隆window除了undefined内部window属性之外的对象.并在新的对象上定义新的undefined(请注意讽刺)然后window = mybetterwindow;
由于这没有任何问题,我的希望很高,但是系统再次失败了,因为window无法通过设计覆盖.我猜测它有它自己的吸气剂,并且根据发现的原型window.prototype甚至更好Window.prototype(注意大写)重新调整自身.
作为我在这个实验中的最后一步,我已经重新定义undefined了这个原型hitted run.没有用,没有任何改变......我尝试创建一个new Window(),但Window不是构造函数,失败!
由于我已经没有想法,我发现自己在这里写这个求助的恳求.如果你有任何想法如何解决动态getter和setter方法的问题,( the existencial problem of life, universe and everything else),在不以任何方式修改......这样,我使用的对象的方式(和奖励它没有need to break一个hole中fabric of time and space)或语法,我恳求你说话或永远保持沉默:).
但不幸的是窗口的未定义属性是
configurable: false
仅在EcmaScript 5.1之后才是这样.以前,它是可以覆盖的.
如果我会使用原始的
window.undefinedgetter和setter,毕竟每次我搞砸并拼错一个单词或什么时都必须调用它.
不,它不会奏效.未定义的值与全局变量"undefined" 之间存在差异.每次遇到未定义的值(例如,在typeof (void 0))时,只有在您明确使用它(例如in )时才会评估变量g.someprop === undefined.
任何想法如何解决动态getter和setter问题?
只有一个解决方案:Proxies.不幸的是,它只是一个和谐的草案,目前只支持Firefox的Javascript 1.8.5.
另请参见是否存在等效的__noSuchMethod__属性,或者在JS中实现它的方法?,检测何时将新属性添加到Javascript对象?或如何检测何时将属性添加到JavaScript对象?它实现了一个轮询解决方案(通过检查更改setInterval).
对于干净的解决方案,您当前必须使用显式的getter函数,您可以传递属性name(g.get("someundefinedproperty")).
| 归档时间: |
|
| 查看次数: |
1863 次 |
| 最近记录: |