Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在使用Object.create时设置单个私有变量_Javascript_Oop - Fatal编程技术网

Javascript 如何在使用Object.create时设置单个私有变量

Javascript 如何在使用Object.create时设置单个私有变量,javascript,oop,Javascript,Oop,我有一个原型函数,用于使用Object.create()生成另外两个函数。但是,私有变量是共享的。如何使每个实例都有自己的变量实例 var testCodePrototype=(函数(){ var得分=0; this.updateScore=函数(金额){ 分数+=金额; 返回“分数更新为”+分数; }; this.getScore=函数(){ 返回分数; }; 返回{ 更新核心, 得分, }; }()); var test1=Object.create(testCodePrototype{

我有一个原型函数,用于使用
Object.create()
生成另外两个函数。但是,私有变量是共享的。如何使每个实例都有自己的变量实例

var testCodePrototype=(函数(){
var得分=0;
this.updateScore=函数(金额){
分数+=金额;
返回“分数更新为”+分数;
};
this.getScore=函数(){
返回分数;
};
返回{
更新核心,
得分,
};
}());
var test1=Object.create(testCodePrototype{
名称:{值:函数(类型){
返回“我是test1”;
}}
});
var test2=Object.create(testCodePrototype{
名称:{值:函数(类型){
返回“我是第二名”;
}}
});
log(test1.name());
log(test2.name());
log(test1.updateScore(5));
console.log(test1.getScore());//返回5

console.log(test2.getScore());//返回5因为JavaScript是一种原型语言,所以原型上的方法和值将与所有“子”对象共享,因为这些对象是活动对象(不是类模板),并且在运行时链接。在您的例子中,您正在指定一个“private”变量(闭包中保存的变量)并从子实例更新该变量。你看到的行为是故意的

在你的情况下,你不能真正做你想做的事。原型函数将无法访问继承树中较高的“私有”变量。您可以通过将“public”变量分配给对象本身来实现这一点,尽管


一个选项是创建新对象,基本上将方法重写为实例方法。你不想那样做是可以理解的。但是,您也可以使用更具功能性的方法,使用函数currying来实现您的结果。

您应该在每个对象内创建一个属性
score
,并将其与
限定符一起使用:

var testCodePrototype=(函数(){
this.updateScore=函数(金额){
这个分数+=金额;
返回“分数更新为”+this.Score;
};
this.getScore=函数(){
返回此.score;
};
返回{
更新核心,
得分
};
}());
var test1=Object.create(testCodePrototype{
名称:{值:函数(类型){
返回“我是test1”;
}},
分数:{可写:true,值:0}
});
var test2=Object.create(testCodePrototype{
名称:{值:函数(类型){
返回“我是第二”;
}},
分数:{可写:true,值:0}
});
log(test1.name());
log(test2.name());
log(test1.updateScore(5));
console.log(test1.getScore());//5.

console.log(test2.getScore());//0
您需要一个构造函数。或者一个
init
方法。可能的重复应该提到
this.score
不再是私有的,也不再是变量。