使用自调用函数并调用
JavaScript 使用原型并且没有像面向对象语言那样的类(或与此相关的方法)。JavaScript 开发人员需要在 JavaScript 中思考。
维基百科引用:
与许多面向对象的语言不同,函数定义和方法定义之间没有区别。相反,区别发生在函数调用期间;当函数作为对象的方法被调用时,该函数的本地 this 关键字将绑定到该对象以进行该调用。
使用自调用函数和调用函数调用私有“方法”的解决方案:
var MyObject = (function () {
    
  // Constructor
  function MyObject(foo) {
    this._foo = foo;
  }
  function privateFun(prefix) {
    return prefix + this._foo;
  }
    
  MyObject.prototype.publicFun = function () {
    return privateFun.call(this, ">>");
  }
    
  return MyObject;
}());
var myObject = new MyObject("bar");
myObject.publicFun();      // Returns ">>bar"
myObject.privateFun(">>"); // ReferenceError: private is not defined
该呼叫功能可以让我们调用私有函数与适当的上下文(this)。
使用 Node.js 更简单
如果您使用的是Node.js,则不需要IIFE,因为您可以利用module加载系统:
function MyObject(foo) {
  this._foo = foo;
}
    
function privateFun(prefix) {
  return prefix + this._foo;
}
MyObject.prototype.publicFun = function () {
  return privateFun.call(this, ">>");
}
    
module.exports= MyObject;
加载文件:
var MyObject = require("./MyObject");
    
var myObject = new MyObject("bar");
myObject.publicFun();      // Returns ">>bar"
myObject.privateFun(">>"); // ReferenceError: private is not defined
(新!)未来 JavaScript 版本中的原生私有方法
TC39私有方法和 JavaScript 类的 getter/setter提案处于第 3 阶段。这意味着很快,JavaScript 将本地实现私有方法!
请注意,现代 JavaScript 版本中已经存在JavaScript 私有类字段。
下面是一个如何使用它的例子:
class MyObject {
  // Private field
  #foo;
    
  constructor(foo) {
    this.#foo = foo;
  }
  #privateFun(prefix) {
   return prefix + this.#foo;
  }
    
  publicFun() {
    return this.#privateFun(">>");
  }
}
您可能需要JavaScript 转译器/编译器才能在旧的 JavaScript 引擎上运行此代码。
PS:如果您想知道为什么要使用#前缀,请阅读此.
(已弃用)带有绑定运算符的 ES7
警告:绑定运算符 TC39 命题已接近死亡https://github.com/tc39/proposal-bind-operator/issues/53#issuecomment-374271822
bind 操作符::是一个 ECMAScript提议,在 Babel(阶段 0)中实现。
export default class MyObject {
  constructor (foo) {
    this._foo = foo;
  }
  publicFun () {
    return this::privateFun(">>");
  }
}
function privateFun (prefix) {
  return prefix + this._foo;
}