gpt4 book ai didi

javascript - 如果原型(prototype)无法访问私有(private)变量, "clean up"代码的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-29 18:33:10 27 4
gpt4 key购买 nike

大家好,我现在拥有的是:

var Human=function(){
this._a=Math.random();
};
(function() {
var before_get = function(human) {
};
var before_set = function(human, v) {
};
Human.prototype={
get A(){
before_get(this);
return this._a;
},
set A(v){
before_set(this, v);
this._a=v;
}
};
})();
alert(new Human().A); // test
alert(new Human().A); // test

一切都很好,除了我不希望将变量 _a 暴露给原型(prototype)以外的任何其他地方。好的,我进行了一些搜索并意识到那是不可能的,所以我想知道我们通常是否保留它(我的意思是我们只是让那些 _a 变量到处乱飞还是有更好的解决方案)?

最佳答案

JavaScript 中没有私有(private)这样的东西,所以这是无法实现的。一般来说,我们没有像其他 C#/Java 那样的通用属性或 setter/getter。

可以使用的模式是闭包而不是原型(prototype)。

var Human = function() {
var a = Math.random();
var o = {};
Object.defineProperties(o, {
"A": {
"get": function() {
return a;
},
"set": function(val) {
a = val;
}
}
});
return o;
}

一般来说,您不应该将属性写入原型(prototype)。原型(prototype)应该包含方法。

清理this._a的唯一方法如下

var Human = (function() {
var Human=function(){
this._a=Math.random();
};
var before_get = function(human) {
};
var before_set = function(human, v) {
};
Human.prototype={
getA(){
before_get(this);
return this._a;
},
setA(v){
before_set(this, v);
this._a=v;
}
};
return function(args) {
var h = new Human(args);
return {
getA: h.getA.bind(h),
setA: h.setA.bind(h)
}
}
})();

关于javascript - 如果原型(prototype)无法访问私有(private)变量, "clean up"代码的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5734289/

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