gpt4 book ai didi

javascript - 在 javascript 中,如何使用私有(private)方法向对象添加/执行新方法?

转载 作者:行者123 更新时间:2023-11-30 09:03:59 25 4
gpt4 key购买 nike

希望使用对象的私有(private)方法扩展定义和/或执行新方法——就像我要在原始声明中定义方法一样——除了这些新方法仅适用于要执行一次的对象,而不是 Klass 本身。

例如:

var Klass = function() {
var privateFn = function() { return 15 };
this.publicFn1 = function() { return privateFn()+1; };
}

var k = new Klass();
console.log( k.publicFn1() ); // prints 16

假设我想在 Klass 上创建和/或执行一个新方法 sum2(),它将向 privateFn 添加 2。

尝试过脑死亡

k.publicFn2 = function() { return privateFn()+2 }
console.log( k.publicFn2() );

它不起作用是完全有道理的,但是什么能起作用呢?

请注意,由于函数非常长,因此尝试维护 privateFn() 而不是 self.privateFn() 的语法 - 这可能要求过高, 但人们希望。

最佳答案

在 ECMAScript 中没有私有(private)这样的东西

var Klass = function() {
var privateFn = function() { return 15 };
this.publicFn1 = function() { return privateFn()+1; };
}

privateFn 是一个局部变量,publicFn1 根据范围规则(和闭包)可以访问该变量。

不能Klass函数范围之外访问privateFn

如果您想在函数 Klass 的范围之外访问 privateFn,那么您必须通过代理公开它,或者将它注入(inject)作用域链的更深处。

代理就像是

this._private = function() {
return privateFn;
}

在作用域链上进一步注入(inject)就像

var Klass = function() {
var privateFn = function() { return 15 };
this.publicFn1 = function() { return privateFn()+1; };
this.uid = Klass.uid++;
Klass.instances[this.uid] = {
privateFn: privateFn
};
}
Klass.uid = 0;
Klass.instances = [];

k.publicFn2 = function() { return Klass.instances[this.uid].privateFn()+2 }

两个都很丑。

它们丑陋的原因是您正在模拟经典 OO

请改用原型(prototype) OO。

Shameless prototypical OO plug

关于javascript - 在 javascript 中,如何使用私有(private)方法向对象添加/执行新方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6732309/

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