使用自调用功能并调用
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,因为您可以利用模块加载系统:
function MyObject (foo) {
this._foo = foo;
}
function privateFun (prefix) {
return prefix + this._foo;
}
MyObject.prototype.publicFun = function () {
return privateFun.call(this, '>>');
}
exports.MyObject = MyObject;
加载文件:
var MyObject = require('./MyObject').MyObject;
var myObject = new MyObject('bar');
myObject.publicFun(); // Returns '>>bar'
myObject.privateFun('>>'); // ReferenceError: private is not defined
(实验性)带有Bind运算符的ES7
绑定运算符::
是ECMAScript 提议,在Babel(阶段0)中实现。
export default class MyObject {
constructor (foo) {
this._foo = foo;
}
publicFun () {
return this::privateFun('>>');
}
}
function privateFun (prefix) {
return prefix + this._foo;
}
加载文件:
import MyObject from './MyObject';
let myObject = new MyObject('bar');
myObject.publicFun(); // Returns '>>bar'
myObject.privateFun('>>'); // TypeError: myObject.privateFun is not a function