gpt4 book ai didi

javascript - JS 私有(private)方法没有在每次构造函数调用时重新定义

转载 作者:行者123 更新时间:2023-11-29 16:21:29 25 4
gpt4 key购买 nike

如何创建一个每次调用构造函数时都不会重新定义的 Javascript 私有(private)方法?

据我所知,在 OOP-JS 中,私有(private)方法是定义在一个“类”的“构造方法”中的方法,每次实例化一个新“对象”时都会被调用。我在想也许一个函数声明(即 function name(),而不是函数表达式 var name = function())可以解决问题,但我怎么能确保以下代码只声明我的函数一次?

​function Tester() {
function test () {
console.log("executed");
}
}
var t1 = new Tester();
var t2 = new Tester();

最佳答案

How do you make a Javascript private method that is not redefined each time you call the constructor ?

你不能(好吧,请看下面的一些回旋余地)。但是除非您要拥有数千个 Tester 实例,否则不要太担心;大多数引擎可能会在创建的多个函数对象之间重用底层代码。 (代码,请注意;不是函数对象或它关闭的上下文,它们必须是唯一的并且每次都分配。但它们不需要很大。当然,相当多的函数函数也相当小......)

...how can I be sure that the following code only declares my function once ?

您可以确定它不会;每次调用 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"

请注意,您可以拥有实现私有(private)的函数,但未分配给对象的任何实例。模块模式可以很方便地做到这一点:

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

在那里,privateFunction 是完全私有(private)的,只能由匿名函数中的代码访问。它只有一个副本,但您可以像使用 privateFunction.call(this) 调用 Tester 实例的方法一样调用它。

或者,当然,由于使用 call 比执行普通调用慢稍微,您可以将实例作为参数传递:

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 的额外成本只是当它成为问题时才成为问题;除非你在一个紧密的循环中调用了数十万次,否则这不太重要。因此,是使用 callthis 还是传递参数主要取决于样式选择。

关于javascript - JS 私有(private)方法没有在每次构造函数调用时重新定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10463245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com