【问题标题】:Javascript calling public method from private one within same objectJavascript从同一对象中的私有方法调用公共方法
【发布时间】:2026-01-11 07:20:04
【问题描述】:

我可以从私有方法中调用公共方法吗:

var myObject = function() {
   var p = 'private var';
   function private_method1() {
      //  can I call public method "public_method1" from this(private_method1) one and if yes HOW?
   }

   return {
      public_method1: function() {
         // do stuff here
      }
   };
} ();

【问题讨论】:

    标签: javascript oop


    【解决方案1】:

    做一些类似的事情:

    var myObject = function() {
       var p = 'private var';
       function private_method1() {
          public.public_method1()
       }
    
       var public = {
          public_method1: function() {
             alert('do stuff')
          },
          public_method2: function() {
             private_method1()
          }
       };
       return public;
    } ();
    //...
    
    myObject.public_method2()
    

    【讨论】:

    • 感谢您的快速回答,我可以在公共变量中放置多个方法吗?我尝试了您的模型,但我有一些 sintax 错误
    • 谢谢,但在我的代码中拒绝被视为一个,(我将不得不调试它。再次感谢丹尼尔的解释
    • 我成功了,再次感谢大家,我接受“BaroqueBobCat”主要是因为他是第一个,但丹尼尔的回答更完整
    【解决方案2】:

    为什么不把它作为你可以实例化的东西呢?

    function Whatever()
    {
      var p = 'private var';
      var self = this;
    
      function private_method1()
      {
         // I can read the public method
         self.public_method1();
      }
    
      this.public_method1 = function()
      {
        // And both test() I can read the private members
        alert( p );
      }
    
      this.test = function()
      {
        private_method1();
      }
    }
    
    var myObject = new Whatever();
    myObject.test();
    

    【讨论】:

    • 感谢彼得,不幸的是,我现在有很多代码可以重写我主要用作命名空间的模型。
    【解决方案3】:

    public_method1 不是公共方法。它是一个匿名对象的方法,完全在构造函数的 return 语句中构造。

    如果你想调用它,为什么不这样构造对象:

    var myObject = function() {
        var p...
        function private_method() {
           another_object.public_method1()
        }
        var another_object = { 
            public_method1: function() {
                ....
            }
        }
        return another_object;
    }() ;
    

    【讨论】:

      【解决方案4】:

      这种方法不是可取的吗?不过我不确定

      var klass = function(){
        var privateMethod = function(){
          this.publicMethod1();
        }.bind(this);
      
        this.publicMethod1 = function(){
          console.log("public method called through private method");
        }
      
        this.publicMethod2 = function(){
          privateMethod();
        }
      }
      
      var klassObj = new klass();
      klassObj.publicMethod2();
      

      【讨论】:

        【解决方案5】:

        不知道直接答案,但以下应该可以。

        var myObject = function() 
        {
           var p = 'private var';   
          function private_method1() {
           _public_method1()
          }
          var _public_method1 =  function() {
                 // do stuff here
            }
        
          return {
            public_method1: _public_method1
          };
        } ();
        

        【讨论】:

          最近更新 更多