我已经看到*可以将某个键作为变量和函数调用的东西。 该变量将返回一个值,该函数将执行一些功能。
obj.test
// E.g. 16
obj.test(32)
// do something with 32
我不知道这是什么图书馆。这不是典型的getter / setter场景,因为那时第二个不是函数而是setter。
请告诉我,我并不疯狂。
*)如果我记得在哪里/哪里,我可能不需要问这个问题。
在 TJCrowder 关于toString()
作为最后一种可能性的评论之后,玩弄了exactly what I wanted **(随意投票;)) 。但我想要的是主观的,我要求的不是。 T.J.Crowder 尽其所能地回答了其他有类似问题的人可能需要的情景,因此我接受了他的回答。
**)在我使用的所有库中点击toString
之后,我发现Raphael做了类似的事情。
答案 0 :(得分:3)
如果o.test()
调用某个函数,则o.test
会返回一个函数引用,这是一个保证。关于你可能会看到什么的一些可能的想法:
如果您在分配某些内容(obj.test = 42;
)时看到了不同的行为,那么当检索时,obj.test();
),这可能是非对称属性。更多信息如下。
如果在某个表达式中使用o.test
,例如var x = o.test + 42;
或element.innerHTML = o.test;
,则可能是他们使用了被覆盖的toString
和/或{{ 1}}。更多信息如下。
首次使用后,该属性可能会重新定义,因此valueOf
会为您提供o.test
,但会更改16
属性的定义。更多关于在下面重新定义自己的属性。
在评论中你说过:
...在评论中它说像这样的代码使函数double成为变量。
我能看到的最接近你指定的地方(不是从中读取)并且它会记住该值。看起来像这样:
o.test
这是一个非对称属性的例子:当你读它时,它总是一个函数;但当你写它时,你可以写任何值,它会记住它。当你返回时,我已经使用存储的值创建了它给你的功能,除非你给它一些其他东西可以使用。
对于不对称属性可能有很好的用例,但如果是这样的话,我希望它们之间的差别很小。 (例如,浏览器中的var o = {};
(function(obj) {
var storedValue;
function weirdFunction(val) {
return arguments.length === 0 ? storedValue : val;
}
Object.defineProperty(obj, "test", {
get: function() {
return weirdFunction;
},
set: function(value) {
storedValue = value;
},
enumerable: true
});
})(o);
o.test = 16;
console.log(o.test()); // 16
console.log(o.test(32)); // 32
console.log(o.test()); // 16
o.test = 24;
console.log(o.test()); // 24
console.log(o.test(32)); // 32
console.log(o.test()); // 24
属性是一种非对称属性,它使人们无可比拟,并且在后面使用是一种皇家痛苦;一个类别的例子"哇,他们真的,真的不应该& #39; t就像那样" ...)
document.cookie
/ toString
技巧以下是valueOf
/ toString
技巧的示例(我不推荐它,但它适用于某些警告):
valueOf
它要求无论使用属性作为非函数做什么来转换它,就像var obj = {test: function(val) { return val; }};
obj.test.valueOf = obj.test.toString = function() {
return 16;
};
console.log(obj.test); // 16
console.log(obj.test(32)); // 32
那样(对我来说是Chrome)。例如,将其转换为字符串或数字:console.log
(隐式调用var str = "The result is " + obj.test;
)或toString
(隐式调用var = 5 + obj.test;
)。如果使用未转换的值,那么(当然)它是一个函数引用。
在ES5兼容系统上,一个属性可以做的另一个真正可怕的事情是在使用它时重新定义:
valueOf
但不要这样做。只是不要。 : - )
答案 1 :(得分:0)
我可能想到的唯一解决方案是,'obj'稍后会重新定义。
答案 2 :(得分:0)
我正在玩 T.J.Crowder 的评论,提到避免返回函数引用的唯一方法是使用toString
/ valueOf
。我得到的东西可能就是我所看到的:
var obj = {
test: (function() {
var storedValue = 'Nothing. Pass me a number.';
var doSomething = function(val) {
storedValue = val;
return val + ' black rainbows';
}
doSomething.toString = function() {
return storedValue;
}
return doSomething;
})()
};
有效:
obj.test // Nothing. Pass me a number.
obj.test(45) // "45 black rainbows"
obj.test // 45
这不是一个可设定的变量,但我认为假设在看到这个之后我做了那个部分是合理的。但是,也许一些特制的技巧也可能实现这一点。