Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.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 将访问相同的原型变量';x';通过此.x创建单独的副本?_Javascript_Html_Prototype_This - Fatal编程技术网

Javascript 将访问相同的原型变量';x';通过此.x创建单独的副本?

Javascript 将访问相同的原型变量';x';通过此.x创建单独的副本?,javascript,html,prototype,this,Javascript,Html,Prototype,This,我试图理解通过prototype访问变量与通过this访问变量之间的区别。在一个对象中,它似乎创建了一个单独的x副本,一个用于this.x,另一个用于*.prototype.x。但在另一种情况下,看起来两者指向同一副本 测试承诺 点击我 函数估计(){ } Estimate.prototype.sharedVar=888; Estimate.prototype.print=函数(){ console.log(“*****************************************

我试图理解通过
prototype
访问变量与通过
this
访问变量之间的区别。在一个对象中,它似乎创建了一个单独的
x
副本,一个用于
this.x
,另一个用于
*.prototype.x
。但在另一种情况下,看起来两者指向同一副本


测试承诺
点击我
函数估计(){
}
Estimate.prototype.sharedVar=888;
Estimate.prototype.print=函数(){
console.log(“*************************************************************************”);
console.log(“*共享变量:”,this.sharedVar);
log(“*Estimate共享变量:”,Estimate.prototype.sharedVar);
console.log(“*************************************************************************”);
}
Estimate.prototype.update=函数(值){
this.sharedVar=值+100;
Estimate.prototype.sharedVar=值+300;
}
功能测试(){
var o1=新估计();
var o2=新估计();
o1.print();
o2.print();
o1.更新(555);
o1.print();
o2.print();
}

实际上
X.prototype.Y
在您希望向
X
的每个实例添加相同属性(此处为
Y
)时非常有用。如果您希望这些元素之间共享一个值,那么您可以轻松地向
X
本身添加一个属性,或者您可以创建一个全局变量,每个事物都可以访问该值

但如果您想将其完全隐藏在
X
objects范围之外,则可以尝试以下方法:

varx=(函数X(){
_X.共享值=3;
var myFunc=函数(){
_X.SharedValue++;
};
myFunc.prototype.getShared=()=>\u X.SharedValue;
返回myFunc;
}());

log(new X().getShared(),new X().getShared(),new X().getShared())添加prototype属性时,它会影响具有该prototype的所有对象。使用关键字this时,它仅影响该实例

下面函数中的两个语句不相等。他们正在改变两个独立的变量。当您第一次初始化对象时,它们没有属性,因此解释器将搜索以查看原型是否具有该属性。当您调用update时,它向实例添加了一个新属性。当您第一次搜索this.sharedVar时,该实例没有它,因此它将搜索原型以查找共享var,如果没有找到它,它将继续转到对象的sharedVar

在之前和之后的图像中,您可以看到发生了什么