使用自调用函数并调用
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;
}