如何创建一个每次调用构造函数时都未定义的 Javascript 私有方法?
你不能(好吧,请参阅下面的一些回旋余地)。但除非你有数千个实例Tester
,不用太担心;大多数引擎可能会在创建的多个函数对象中重用底层代码。 (这code, 头脑;不是函数对象或它关闭的上下文,must每次都是唯一且分配的。但它们不需要很大。当然,相当大的函数也相当小......)
...我如何确定以下代码仅声明我的函数一次?
你可以肯定它不会;它每次都会声明该函数Tester
叫做。证人:
function Tester() {
this.test = test;
function test () {
console.log("executed");
}
}
var t1 = new Tester();
var t2 = new Tester();
console.log(t1.test === t2.test); // "false"
请注意,您可以拥有实现私有的函数,但不分配给对象的任何实例。模块模式可以很方便地做到这一点:
var Tester = (function() {
function Tester(name) {
this.name = name;
}
Tester.prototype.publicFunction = function() {
privateFunction.call(this);
};
function privateFunction() {
console.log("My name is " + this.name);
}
return Tester;
})();
var t = new Tester("Fred");
t.publicFunction(); // Outputs "My name is Fred" via the private function
There, privateFunction
是完全私有的,只能由匿名函数中的代码访问。它只有一个副本,但您可以像调用 a 的方法一样调用它Tester
实例使用privateFunction.call(this)
.
或者,当然,因为使用call
is slightly比正常调用慢,您可以将实例作为参数传递:
var Tester = (function() {
function Tester(name) {
this.name = name;
}
Tester.prototype.publicFunction = function() {
privateFunction(this);
};
function privateFunction(t) {
console.log("My name is " + t.name);
}
return Tester;
})();
var t = new Tester("Fred");
t.publicFunction(); // Outputs "My name is Fred" via the private function
当然,额外的费用call
只有当它是一个问题时,它才是一个问题;除非你在一个紧密的循环中调用某个东西数十万次,否则这不太重要。那么是否使用call
and this
或传递一个论点主要是一种风格选择。