我正在尝试解决最近想到的一个问题。 假设我们想要并且知道如何在 javascript 中使用动态 getter 和 setter,更像是 php 中的那些 (__get, __set)。但是由于 javascript 没有包罗万象的属性,我们唯一能做的就是提供一个可能的键列表并迭代以仅在这些键上添加 getter 和 setter,并希望没有其他人会出现。
但问题远未解决。所以我想到的下一个方法是使用带有 try 和 catch 的讨厌的 hack,所以任何时候在对象中未定义的名称都可以使用 catch 作为 getter(至少),然后恢复代码,这是一件困难且可能毫无意义的事情。但是从这里出现了我的第二个问题,在这样的用途中:
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。
尝试的其他 hack 是克隆 window 对象,但 undefined 和内部 window 属性除外。并在新对象上定义新的undefined(请注意讽刺)然后window = mybetterwindow;
由于这没有引起任何问题,我的希望很高,但系统再次让我失望,因为 window 无法被设计覆盖。
我猜它有自己的 getter,它根据 window.prototype 或更好的 Window.prototype(注意大写)中的原型(prototype)重新实例化自己。
作为我在这个实验中的最后一步,我在这个原型(prototype)命中运行时重新定义了 undefined。无济于事,没有任何改变...我尝试创建一个 new Window(),但是 Window 不是构造函数,失败!
由于我已经没有想法了,所以我发现自己在这里写下了这篇求助信。
如果您有任何想法如何解决动态 getters 和 setters 问题,(生命、宇宙和其他一切的存在问题),以一种不会以任何方式修改...的方式我使用这些对象(作为奖励,它不会需要打破时间和空间结构中的洞)或语法,我恳求你说话或永远保持沉默 :)。
最佳答案
But unfortunately the undefined property of window is
configurable: false
只有在 EcmaScript 5.1 之后才是正确的.以前,它是可覆盖的。
what if I would use the original
window.undefinedgetter and setter, after all it must be called every time I screw up and misspell a word or something.
不,这是行不通的。 undefined value之间有区别和全局变量“未定义”。每次遇到 undefined 值时(例如在 typeof (void 0) 中),不会评估该变量,仅当您显式使用它时(例如在 g 中) .someprop === undefined).
Any ideas how to solve the dynamic getters and setters problem?
只有一种解决方案:Proxies .可惜只是和声稿,目前只有supported in Firefox' Javascript 1.8.5 .
另见 Is there an equivalent of the __noSuchMethod__ feature for properties, or a way to implement it in JS? , Detect when a new property is added to a Javascript object?或 How to detect when a property is added to a JavaScript object?它实现了轮询解决方案(通过 setInterval 检查更改)。
对于一个干净的解决方案,您目前必须使用一个明确的 getter 函数,您传递属性名称 (g.get("someundefinedproperty"))。
关于javascript - 动态 getter 和 setter - 一种可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13849533/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],
首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟
我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail