【问题标题】:Is this the correct way to do private functions in Javascript / node.js?这是在 Javascript / node.js 中执行私有函数的正确方法吗?
【发布时间】:2015-12-07 13:29:12
【问题描述】:

我在 node.js 中写的一个类如下:

module.exports = exports = function(){ return new ClassA() };

function ClassA(){
    this.myvariable = 0;
}

我有一个想要私有的函数。据我了解,如果函数是在构造函数之外声明的,它本质上将是一个无法引用 this.myvariable 的静态函数。

在构造函数中声明函数的正确方法是这样的:

//within constructor
this.myFunction = function myFunction(){
    console.log(this.myvariable)
}

或者有没有更好的方法,不会给我留下一个潜在的巨大构造函数?

编辑:看起来我在这里误解了一些东西,因为上面的代码甚至不起作用......

【问题讨论】:

    标签: javascript node.js oop


    【解决方案1】:

    拥有私有函数的最简单方法是在类之外声明一个函数。原型函数仍然可以很好地引用它,并将它们的this 范围传递给.call()

    function privateFunction() {
      console.log(this.variable)
    }
    
    var MyClass = function () {
      this.variable = 1;
    }
    
    MyClass.prototype.publicMethod = function() {
      privateFunction.call(this);
    }
    
    var x = new MyClass();
    x.publicMethod()
    

    【讨论】:

      【解决方案2】:

      2019 年 5 月 17 日更新

      在JavaScript的下一个规范ESNext中,增加了对私有方法和属性的支持。

      要将属性或函数设为私有,请使用字符#

      class Foo {
          #privateAttribute = 'hey';
      
          showPrivate() {
              console.log(this.#privateAttribute);
          }
      }
      

      已在 node.js v12+ 中实现。


      您可以配置 babel 以使用以下 plugin 对其进行转译。

      需要 babel v7.0.0+。

      【讨论】:

      • 使用箭头函数还可以定义私有方法,如属性#privateMethod = () => { ... code ... }
      • 私有实例变量可以这样声明:this.#privateVar = 'asdf';。您还可以通过在开头使用# 命名私有函数来定义它们。 #privateMethod() {...}。不必使用#a = () => {...}
      【解决方案3】:

      您不会添加到module.exports 的任何内容都将是该module 的私有内容,并且无法从模块外部访问。 同样在控制器内部将this 的引用存储到局部变量中

      var self = this;
      

      您可以使用显示模块模式。

      var myNameSpace = function() {
          var current = null;
          function init() {
              …
          }
          function change() {
              …
          }
          function verify() {
              …
          }
          return{
              init:init,
              change:change
          }
      }();
      module.exports = exports = myNameSpace;
      

      这样initchange 将是public 并且验证将是私有的。

      您可以看到 Douglas Crockford 制作私人会员的风格。 http://javascript.crockford.com/private.html

      编辑
      Douglas Crockford 的链接现已更改。
      新链接http://crockford.com/javascript/private.html

      【讨论】:

        【解决方案4】:

        是的,你可以创建一个私有方法,但它不能成为原型的一部分

        function ClassA()
        {
            var myvariable;
        
            var private = function()   // This is private method
            {
                myvariable = 0;
            }
        
            this.public = function()   // This is public method
            {
                private();
            }
        }
        

        【讨论】:

          【解决方案5】:

          Javascript 公共功能

          ClassA.prototype.myFunction = function (string) {
             //your logic
          }
          

          另一种公共函数

           function ClassA(){
              this.myvariable = 0;
          
              var MyFunction3 = function () {
                 //your logic
              };
              this.MyFunction2 = function () {
                  //your logic
              };
           }
          

          javascript 私有函数

          function ClassA() {
          
              function MyFunction() {
                 //your logic
             }
          }
          

          我更愿意访问this link,它会描述你的每一口井。

          【讨论】:

            【解决方案6】:

            实际上,javascript中没有类。
            看一个 json 对象构造函数:

            var ClassA=function() {
                this.publicFunction=function (){
                    console.log("public function");
                }
                function privateFunction(){
                    console.log("private function");
                }
                return this;
            }
            

            然后你使用 new 创建一个 ClassA:

            var a=new ClassA();
            

            您可以使用 publicFunction,但您不能像使用 privateFunction 一样使用 privateFunction。

            a.publicFunction();
            a.privateFunction();//you can't do this
            

            对你有什么帮助吗?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-07-16
              • 2019-10-01
              • 1970-01-01
              • 2018-02-13
              相关资源
              最近更新 更多