最佳答案
执行私有功能的常用方法是使用各种“方法”关闭的功能,例如:拿起他们的狗示例,改变这个:
// The basic Dog example
var Dog = Base.extend({
bark: function() {
return 'Ruff! Ruff!'
}
});
至
// Adding a private function
var Dog = Base.extend((function(){
function trulyPrivate() {
console.log(this.bark());
}
return {
bark: function() {
return 'Ruff! Ruff!'
},logBark: function() {
trulyPrivate.call(this);
}
};
})());
用法:
new Dog().logBark(); // logs "Ruff! Ruff!" using the truly private function behind the scenes
在私有字段中,通常的方法是在构造函数中构建需要真正私有字段的任何东西,这样它们就可以关闭构造函数调用中的(私有)变量,a’la Crockford’s pattern:
function Foo(arg) {
var trulyPrivateData = arg;
this.logIt = function() {
console.log(trulyPrivateData);
};
}
用法:
var f = new Foo(42);
f.logIt(); // logs 42 even though there's no way,externally,to get that value from `f`
… selfish取消了实际的构造函数,但初始化函数应该用于相同的目的:
var Dog = Base.extend({
initialize: function(arg) {
var woof = arg || 'Ruff! Ruff!';
this.bark = function() {
return woof;
};
}
});
现在,你不能设置纬线(除了在施工时,因为我们故意这样做),你只能从树皮中取回它.例如,它是真正的私人(除了我们明确允许树皮返回它).
如果你了解这方面的技术细节,我博客上的这些文章可能(或可能不是)有用,因为当你进入私人职能部门时,你通常必须开始管理:
> Mythical Methods
> You must remember this
> Private Methods in JavaScript(严重需要更新/重写)
如果你想要另一个东西来评估,那就是我的Lineage
project,它同样是纯粹的原型继承,但是可以轻松访问父对象的属性,函数等,以及一种主动鼓励私有范围的语法.