参考Javascript:好的部分,试图构建一种类原型对象,然后我可以用它来创建实例。但是使用建议用于通过闭包创建对象和信息隐藏的模式,我发现我创建了一个私有静态成员而不是私有实例成员。
在这种情况下,我正在尝试创建一个“帐户”对象,该对象具有由balance()方法返回的私有值(balance)变量:
<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>
结果如下:
帐户名称= Mario Incandenza余额:3175
帐户名称= Hal Incandenza余额:3175
因此,看到两个帐户的所有提款和存款的总和显而易见,我创建了一个静态的“类”变量(在javaspeak中)
那么如何在实例级创建var值并将其隐藏/私有?
答案 0 :(得分:3)
()
声明末尾的var account =
表示您只调用该初始化函数一次,并将其返回值分配给您命名为account
的单个对象。然后,您使用该单个对象作为原型制作多个对象,这意味着它们都使用相同的闭包,并且具有单个余额值。
您要做的是将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
上定义一次方法。为了完成闭包封装,此版本必须在每个实例上创建方法的新副本。
答案 1 :(得分:-2)
实际上写一些类似的东西会更好:
var account = function(/** name, id **/) {
this.value = 0;
//this.name = name;
//this.id = id;
}
account.prototype.deposit = function(amount) {
this.value += amount;
}
...
你正在为每个实例返回函数,因此它比原型设计需要更多的内存..;)