如何在Javascript中将对象属性设置为函数和变量?

时间:2014-08-21 10:29:38

标签: javascript function object ecmascript-5 ecmascript-6

我已经看到*可以将某个键作为变量和函数调用的东西。 该变量将返回一个值,该函数将执行一些功能。

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做了类似的事情。

3 个答案:

答案 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

Live Example

这是一个非对称属性的例子:当你它时,它总是一个函数;但当你它时,你可以写任何值,它会记住它。当你返回时,我已经使用存储的值创建了它给你的功能,除非你给它一些其他东西可以使用。

对于不对称属性可能有很好的用例,但如果是这样的话,我希望它们之间的差别很小。 (例如,浏览器中的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

这不是一个可设定的变量,但我认为假设在看到这个之后我做了那个部分是合理的。但是,也许一些特制的技巧也可能实现这一点。