0

从 javascript 中返回的对象中引用私有方法的最佳方法是什么?我给你留下一些示例代码:

var HelloWorld = (function(){
    var hello = function(){
        console.log("hello")
    },
    return{
        addToList: function(){
            //how can i reference hello from here dynamically like:
                            //this["hello"] or this["hell" + "o"]
        }       
    }
})()
4

5 回答 5

2

因为 return 仍在闭包内,所以你可以直接调用hello。所以:

hello();

正如其他答案所建议的那样,要使其“动态”,您需要保存hello一些内容。如果您想将它附加到this而不是另一个对象,您只需要存储一个引用,this以便以后可以访问它。

var HelloWorld = (function(){
  var self = this;
  this.hello = function(){
    console.log("hello")
  };
  return {
    addToList: function(){
        self["hello"]();
    }       
  }
})();
于 2013-01-18T18:55:40.560 回答
1

照原样,您不能hello像示例代码的注释中提到的那样“动态地”引用该函数。(我假设您对“动态”的定义是给定一个包含单词“hello”的字符串,并以某种方式使用它来引用函数hello。)

但是,您可以将 hello 移动到一个对象中,并使用方括号表示法从该对象中引用它:

var HelloWorld = (function () {
    var privateCode = {
        hello: function () {
            console.log('hello');
        }
    };

    return {
        addToList: function () {
            // access via `privateCode['hello']()`
        }       
    };
}());
于 2013-01-18T19:01:28.697 回答
1

你不能使用this,因为你还没有把它变成对象的一部分。

var HelloWorld = (function () {

    var hello = function () { console.log("hello"); };

    return {
        addToList : function () { hello(); }
    };

}());

那会很好用。

如果您需要使用字符串来访问它,那么您需要 make hello,那么您有两种选择:

1)创建一个公共函数,你可以用一个字符串调用它,它调用hello

return {
    command : function (string) { if (this[string]) { this[string](); },
    sayHello : function () { hello(); }
};

2)创建一个私有对象,它存储你的方法(然后你可以用字符串调用它):

var private_actions = {
    hello : function () { console.log("hello"); }
};

return {
    command : function (string) {
        if (private_actions[string]) { private_actions[string](); }
    }
};
于 2013-01-18T19:09:39.503 回答
1

hello()不是一种方法。它只是闭包中的一个函数。所以,你可以从你的addToList()方法中调用它。

如果您希望该hello函数的行为类似于this设置为对象实例的方法,则必须像本示例中那样将实例传递给它。

var HelloWorld = (function(){
    var hello = function(){
        console.log("hello")
    },
    return{
        addToList: function(){
            //how can i reference hello from here dynamically like:
            hello.call(this);
        }       
    }
})()

如果您真正想做的是通过字符串引用访问 hello 函数,那么您将无法轻松地通过字符串名称访问局部变量。如果您想这样做,您可能必须将 hello 函数放入本地对象中,如下所示:

var HelloWorld = (function(){
    var locals = {
        hello: function(){
            console.log("hello")
        }
    };
    return{
        addToList: function(){
            //how can i reference hello from here dynamically like:
            locals["hello"].call(this);
        }       
    }
})()
于 2013-01-18T18:57:26.010 回答
1

由于hello只存在于匿名 IIFE 的范围内,因此您需要将其存储一些中间对象,以便能够hello从公共方法动态访问:

var HelloWorld = (function(){
    var privates = {
        hello: function (){
            console.log("hello")
        }
    };

    return {
        addToList: function (){
            privates['hello']();
        } 
    }
})();

HelloWorld.addToList();

工作示例

于 2013-01-18T19:23:02.877 回答