Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.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 Modulepattern和对象实例-属性值的意外更改_Javascript_Object_Module_Prototypejs - Fatal编程技术网

Javascript Modulepattern和对象实例-属性值的意外更改

Javascript Modulepattern和对象实例-属性值的意外更改,javascript,object,module,prototypejs,Javascript,Object,Module,Prototypejs,亲爱的社区和Javascript向导 我遇到了一种我无法理解的行为 我的意图是创建一个模块,它模拟私有变量并控制对象的创建 我希望下面的例子能说明我想要什么,我的问题是什么 const ex=(()=>{ //创建点的构造函数 功能点(){ 设x; 让y; //我认为使用prototype是个好主意,因为可以预期会创建很多点,所以我不会因为大量的函数复制而浪费内存。 Point.prototype.setX=xValue=>{ x=x值; } Point.prototype.setY=yVal

亲爱的社区和Javascript向导

我遇到了一种我无法理解的行为

我的意图是创建一个模块,它模拟私有变量并控制对象的创建

我希望下面的例子能说明我想要什么,我的问题是什么

const ex=(()=>{
//创建点的构造函数
功能点(){
设x;
让y;
//我认为使用prototype是个好主意,因为可以预期会创建很多点,所以我不会因为大量的函数复制而浪费内存。
Point.prototype.setX=xValue=>{
x=x值;
}
Point.prototype.setY=yValue=>{
y=y值;
}
Point.prototype.getY=()=>{
返回y;
}
}
//返回接口以创建点
//但是隐藏它们的属性。
返回{createPoint:(x,y)=>{
设点=新点();
点setX(x);
赛蒂(y);
返回点;
}}
})();
p1=例如createPoint(1,2);
console.log(p1.getY());//结果是预期的“2”
p2=例如createPoint(3,4);
console.log(p2.getY());//结果是预期的“4”

console.log(p1.getY());//结果是“4”…等等…“4”什么?为什么您的代码存在一些问题:

  • 使用箭头函数的方式。箭头函数中没有自己的“this”对象。所以用它们来定义原型会得到奇怪的结果

  • 谈论这个?啊,是的,您需要使用“this”在类实例的某处存储一个值

  • 在您的案例中使用ES2015(ES6)似乎没有问题。为什么不使用来定义类?(它也没有给你真正的私人道具,但语法有了很大的改进)

  • 在另一个函数或闭包中的函数中创建类实例并不会真正隐藏该类的属性。由于要返回该对象,因此可以通过该对象访问这些值

严格保护类对象的必须是私有的属性/方法并不是真正必要的。建议给它们一些前缀(u是常见的),并且每当您在代码中使用这个前缀时,只能私下使用该变量

const ex=(()=>{
//创建点的构造函数
功能点(){
};
Point.prototype.setX=函数(xValue){
console.trace('hmm');
这个.x=x值;
};
Point.prototype.setY=函数(yValue){
y=y值;
};
Point.prototype.getY=函数(){
把这个还给我;
};
返回{
createPoint:(x,y)=>{
设点=新点();
点setX(x);
赛蒂(y);
返回点;
}
}
})();
常数p1=ex.createPoint(1,2);
log(p1.getY()+“(结果是预期的“2”);
常数p2=ex.createPoint(3,4);
log(p2.getY()+“(结果是预期的“4”);

log(p1.getY()+“(结果是预期的“2”)亲爱的Bulent Vural,非常感谢您的回答。您关于箭头函数的提示是一个很大的帮助,也是一个新的有价值的见解(=您提出的解决方案无疑是一个改进,但有一个功能(以前用于一个对象)丢失了。现在x和y不再从外部看不见。例如,您可以使用p1.x直接访问它们(我很抱歉没有在代码中明确说明这一点).因此,我在第一次尝试“let x”时尝试了“let x”,因此它们隐藏在范围内。我用更多信息更新了我的答案。有一些方法可以成为真正的私人成员,但确实不值得。无论如何,我举了一个例子。非常感谢!你的答案非常有帮助,是我可以进一步研究的一个好点(=