如何在函数中修改JavaScript对象属性值(OOP新手求助)
解决方法:让函数修改你的对象实例
嘿,作为刚接触OOP的新手,遇到这种参数和对象属性混淆的问题太正常啦!咱们一步步来理清问题,然后给出解决方案~
先搞懂为什么原来的函数不起作用
你写的myFunction里的value1、value2、value3都是函数的局部参数——当你调用myFunction(object1.value1, object1.value2, object1.value3)时,传递的是这些属性的具体值(数字属于基本类型,是值传递),所以函数里修改的只是局部变量,和object1本身的属性完全没关系。
方案1:让函数直接接收对象实例(最简单直接)
既然要修改对象的属性,不如直接把整个对象传给函数,这样函数就能直接操作对象的属性啦:
// 修改后的函数,接收对象作为参数 function myFunction(obj) { obj.value1 += obj.value2; // 1 + 2 = 3 obj.value3 += 1; // 3 + 1 = 4 } // 调用时传入你的object1实例 myFunction(object1); // 验证结果 console.log(object1.value1); // 输出3 console.log(object1.value3); // 输出4
原理:对象是引用类型,传递给函数的是对象的引用,所以函数里修改对象的属性会直接影响到原实例。
方案2:把函数变成对象的方法(更符合OOP思想)
在面向对象编程里,操作对象的方法最好和对象本身绑定,这样更符合封装的理念。咱们可以把myFunction改成myObject的方法:
方式A:在构造函数内定义方法
function myObject(value1, value2, value3) { this.value1 = value1; this.value2 = value2; this.value3 = value3; // 给每个实例添加update方法 this.updateValues = function() { this.value1 += this.value2; this.value3 += 1; }; } // 创建实例后直接调用方法 var object1 = new myObject(1,2,3); object1.updateValues(); console.log(object1.value1); // 3 console.log(object1.value3); // 4
方式B:用原型链共享方法(更高效)
如果要创建多个myObject实例,用原型链定义方法可以让所有实例共享同一个方法,节省内存:
function myObject(value1, value2, value3) { this.value1 = value1; this.value2 = value2; this.value3 = value3; } // 把方法添加到原型上 myObject.prototype.updateValues = function() { this.value1 += this.value2; this.value3 += 1; }; var object1 = new myObject(1,2,3); object1.updateValues(); console.log(object1.value1); // 3 console.log(object1.value3); // 4
两种方案都能达到你的需求,如果你只是临时修改单个对象,方案1足够用;如果后续还要给更多实例添加类似操作,方案2更符合OOP的设计思路~
内容的提问来源于stack exchange,提问作者person341
相关产品推荐
相关产品推荐

