【问题标题】:accessing function javascript访问函数 javascript
【发布时间】:2015-03-06 05:20:31
【问题描述】:

如何从其他命名空间访问函数?

例如:

FavoriteFlavor.instructState.prototype = { 
    test: function() {
      // call function show from chooseEmoticonState
      // I have tried calling FavoriteFlavor.chooseEmoticonState.show();
    }
}

FavoriteFlavor.chooseEmoticonState.prototype = {
    show: function() {
    }
}

【问题讨论】:

  • 您是否必须使用prototype 进行编码,或者您是否允许使用不同的javascript 模式??
  • 由于原型是赋予新创建对象的方法(不用作命名空间),每当有人经常希望直接在原型上调用方法而不是在实例化对象上调用它们时对象,这让我想知道您的函数是否布局正确并且应该在实际的命名空间中而不是原型上。

标签: javascript function namespaces


【解决方案1】:

一种方法是直接从prototype 对象调用方法:

FavoriteFlavor.chooseEmoticonState.prototype.show();

但是,任何this 实例引用都不会指向instructState 的实例。您可以通过使用callapply 方法并传递this 作为第一个参数来更正此问题。

FavoriteFlavor.chooseEmoticonState.prototype.show.call(this);

此外,除非您有理由不这样做,否则您可以简单地将chooseEmoticonState 原型的show 方法添加到instructState 原型中。

FavoriteFlavor.instructState.prototype.show = FavoriteFlavor.chooseEmoticonState.prototype.show;

【讨论】:

    【解决方案2】:

    show 函数位于 FavoriteFlavor.chooseEmoticonState.prototype,而不是 FavoriteFlavor.chooseEmoticonState,因此您可以调用它:

    FavoriteFlavor.chooseEmoticonState.prototype.show();
    

    但鉴于它是在原型上,直接调用它并没有多大意义。

    有意义的是在chooseEmoticonState 的实例上调用它:

    // assume chooseState has been instantiated with 
    //    new FavoriteFlavor.chooseEmoticonState();
    chooseState.show();
    

    或者如果show() 不打算作为实例方法,直接放在FavoriteFlavor.chooseEmoticonState 上:

    FavoriteFlavor.chooseEmoticonState = {
        show: function() {
        }
    };
    

    然后然后你可以用你之前尝试的方式调用它:

    FavoriteFlavor.choseEmoticonState.show();
    

    【讨论】:

    • 你是对的!谢谢你的解释。你能简化一下原型模式吗?我对此有点困惑。
    【解决方案3】:

    在不同的 javascript 模式中:(只是为了多样性)

    http://jsfiddle.net/za6muccw/

    FavoriteFlavor = {};
    
    FavoriteFlavor.chooseEmoticonState = (function(){
             //private
        var myprivate = "im private";
    
        function show(){
            alert("goo")
        }
    
        return {
            show : show //its making me public
        }
    })();
    
    FavoriteFlavor.instructState = (function(){
       //private
       var myprivate = "im private";
       FavoriteFlavor.chooseEmoticonState.show();
    })();
    

    【讨论】:

    • 仍在尝试找出任何东西都无法访问的私有变量的点。第二个 IIFE 不返回任何内容,因此 FavoriteFlavor.instructState 的值将是 undefined
    • 它只是为了做一个私有变量的例子,这个模式名称是匿名函数,它允许创建公共和私有变量,在第二个“对象类”中没有任何返回,因为你不是没有发布任何内容,在您返回的第一个节目中,它引用了 function show() 您正在公开,现在 FavoriteFlavor.chooseEmoticonState.show 公开
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多