gpt4 book ai didi

Javascript 私有(private)实例变量?

转载 作者:行者123 更新时间:2023-11-27 23:44:01 26 4
gpt4 key购买 nike

引用Javascript:好的部分,试图构建一种类原型(prototype)对象,然后我可以用它来创建实例。但是使用建议的通过闭包创建对象和信息隐藏的模式,我发现我创建了一个私有(private)静态成员而不是私有(private)实例成员。

在本例中,我尝试创建一个“帐户”对象,该对象具有由balance() 方法返回的私有(private)值(余额)变量:

<head>
<script>
if (typeof Object.create !== 'function') {
Object.create = function (o) {
var F = function () {
};
F.prototype = o;
return new F;
};
};
var account = function() {
var value = 0;
return {
"account_name": "",
deposit: function (amount) {
value = value + amount;
},
withdrawal: function (amount) {
value = value - amount;
},
balance: function( ) {
return value;
}
}
}();
</script>
</head>
<body>
<script>
var account1 = Object.create(account);
var account2 = Object.create(account);
account1.account_name = "Mario Incandenza";
account1.deposit(100);
account1.withdrawal(25);
account2.account_name = "Hal Incandenza";
account2.deposit(5100);
account2.withdrawal(2000);
document.writeln("<p>Account name = " + account1.account_name + " Balance: " + account1.balance() + "</p>");
document.writeln("<p>Account name = " + account2.account_name + " Balance: " + account2.balance() + "</p>");
</script>
</body>

结果如下:

Account name = Mario Incandenza Balance: 3175

Account name = Hal Incandenza Balance: 3175

因此,看到两个帐户的所有取款和存款的总和,显然我已经创建了一个静态“类”变量(用javaspeak)

那么如何在实例级别创建 var 值并保持其隐藏/私有(private)?

最佳答案

var account = 声明末尾的 () 意味着您仅调用该初始化函数一次,并将其返回值分配给您指定的单个对象帐户。然后,您将使用该单个对象作为原型(prototype)来创建多个对象,这意味着它们都使用相同的闭包及其单个余额值。

您想要做的是创建 account 函数,并为每个新对象单独调用它。您只需移动括号即可做到这一点:

var account = function() {
var value = 0;
return {
account_name: "",
deposit: function (amount) {
value = value + amount;
},
withdrawal: function (amount) {
value = value - amount;
},
balance: function( ) {
return value;
}
}
};

var account1 = Object.create(account());
var account2 = Object.create(account());

但是一旦将 account 设为函数,就没有理由使用 Object.create;您可以直接使用函数的返回值:

var account1 = account();
var account2 = account();

或者,您可以使用 new 以稍微更传统的方式做事(尽管 Crockford 说 new 是邪恶的):

var Account = function() {
var value = 0;
this.deposit = function (amount) {
value = value + amount;
};
this.withdrawal = function (amount) {
value = value - amount;
};
this.balance = function( ) {
return value;
}
}

var account1 = new Account();
var account2 = new Account();

这仍然不是非常传统的经典 Javascript,它只会在 Account.prototype 上定义一次方法。为了完成闭包封装,这个版本必须在每个实例上创建方法的新副本。

关于Javascript 私有(private)实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33405634/

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