【问题标题】:Javascript function have sub functions / variablesJavascript函数有子函数/变量
【发布时间】:2011-06-21 20:34:10
【问题描述】:

这是工作代码:

var test = function ()
{
    console.log(test.data);
};

test.data = 'hello';

test.set = function (data)
{
    test.data = data;
};

test.set('Test');
test();

这会将Test 输出到我的javascript 控制台。 现在我想知道,是否有办法使用类似的方法来做到这一点?

var test = {
    this: function ()
    {
        console.log(test.data);
    },

    data: 'hello',

    set: function (data)
    {
        test.data = data;
    }
};

【问题讨论】:

  • 函数是对象,但对象不是函数。当然,您可以将函数存储为对象属性,但不能使普通对象“可调用”。或者你真正想要达到什么目的?您的第二种方法应该有什么优势?
  • 我想通过只使用 test() 来调用函数 test.this()
  • @Felix 我相信你没有抓住重点 - 我认为他正在尝试封装所有信息,并且只是采用一种更整洁/更有条理的方法。
  • 是的,这就是我想要做的。
  • 我希望 JavaScript 也能做到这一点!!!!!

标签: javascript function object


【解决方案1】:

您可以在对象的属性下存储任何函数。你可以调用它们:

let f = { fun1: function () 
                {
                     return 1; 
                } 
        };
f.fun1();

将完美运行。我不确定您是否可以将“this”用作属性名称,因为它是关键字。可能没有问题,但它可能会产生误导。

【讨论】:

    【解决方案2】:

    做这样的事情怎么样:

    function Test () {
      this.data = 'hello';
      this.set = function (data)
        {
            test.data = data;
        }
      this.log = function ()
        {
            console.log(test.data);
        }
    }
    
    var test = new Test ();
    test.set('Test');
    test.log();
    

    这样做的好处是您可以轻松创建新实例。


    如果您只想要一次性,我想说您自己的建议几乎就是您想要的:

    var test = {
        log: function ()
        {
            console.log(test.data);
        },
    
        data: 'hello',
    
        set: function (data)
        {
            test.data = data;
        }
    };
    
    test.set('Test');
    test.log();
    

    但也许您的问题是如何避免“.log”部分?

    【讨论】:

    • 是的,我想避免使用“.log”部分。
    • 所以您希望日志本质上是在构造函数中?
    【解决方案3】:

    正如我在评论中所写,您不能将对象设为“可调用”。但是,您可以从第一个示例中自动执行该过程:

    function extend(func, props) {
        for(var prop in props) {
            if(props.hasOwnProperty(prop)) {
                func[prop] = props[prop];
            }
        }
        return func;
    }
    

    然后调用它:

    var test = extend(function(){
        console.log(test.data);
    },
    {
        data: 'hello',    
        set: function (data) {
            this.data = data;   // note that I changed it to `this.data`
        }
    });
    

    DEMO


    也就是说,我认为你不应该使用这样的函数。如果您只有一个“普通”对象并使用obj.method() 而不是obj() 调用每个方法,将会更容易理解。

    至少你必须非常仔细地记录这一点。

    【讨论】:

    • hasOwnProperty 电话在哪里? ;)
    • @Ivo Wetzel:好吧,我假设一个人只会通过普通对象......但是是的......@ 987654327@的扩展...... bla bla......(我希望有一天他们会内置原型不可可扩展!)...已修复:)
    • 那将是一件好事,但我怀疑他们会这样做:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多