定义Javascript对象的“隐含”方法

时间:2015-09-26 04:26:17

标签: javascript object

让我说我有我的对象,foo:

var foo = {
    name: "fooName",
    consoleLog: function() {console.log("foo!")}
}

...但我不想指定foo.consoleLog()来调用该函数,我只想调用foo()来获得相同的效果,保留对象的所有其他规范,例如上面显示的name,因此foo.name仍应返回fooName

换句话说,如何操纵此操作以便foo()foo!记录到控制台, foo.name将返回fooName

值得注意的是,foo将成为另一个对象的子对象。

所以,看起来可能更像这样:

var bar = {
    foo: {
        name: "fooName",
        consoleLog: function() {console.log("foo!")}
    },
    name: "barName"
}

我试图搜索这个,但我不知道该怎么称呼它 - 一个主要功能?不,那返回了太多的Java。隐含的功能?不,那些结果没有帮助......所以现在我在这里。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

> var foo = function fooName() {console.log("foo!")};
undefined
> foo.consoleLog = foo
{ [Function: fooName] consoleLog: [Circular] }
> foo.name
'fooName'

使用IIFE在单个表达式中进行所有初始化:

> (function(){ var foo = function fooName() {console.log("foo!")}; foo.consoleLog = foo; return foo }())
{ [Function: fooName] consoleLog: [Circular] }

答案 1 :(得分:1)

你可以这样做:

var bar = {
  foo: function fooName() { console.log('foo!'); },
  name: 'barName'
};
bar.foo.anyPropertyButName = 'anyValue';

这种方式foo是一个函数(可以这样调用:bar.foo();)并且具有值为fooName的name属性。

如果你仍然需要bar.foo.consoleLog成为一个函数,只需添加:

bar.foo.consoleLog = bar.foo;