有没有办法通过引用而不是通过值将对象属性传递给函数?
ES5 属性可以有 getter 和 setter。如何传递使用 getter 和 setter 的变量而不是 getter 的结果?
现在我必须传递对整个对象的引用,而不仅仅是我想要的单个属性。
有没有办法通过引用而不是通过值将对象属性传递给函数?
ES5 属性可以有 getter 和 setter。如何传递使用 getter 和 setter 的变量而不是 getter 的结果?
现在我必须传递对整个对象的引用,而不仅仅是我想要的单个属性。
有没有办法通过引用而不是通过值将对象属性传递给函数?
不。事实上,“传递对象属性”最终没有多大意义,因为“属性”的概念在没有它是属性的实体的情况下不存在。
如果这只是一个封装问题并且不想泄露完全控制权,那么您总是可以发挥创意。例如,
var obj = {
sensitive: 'do not share me!',
public: 'hi there',
setPublic: function(val) {
this.public = val;
}
};
function someFunction(setter) {
setter('new value');
}
someFunction(obj.setPublic.bind(obj));
没有办法完全按照您的要求做,因为无论它的来源是什么,值类型(即非对象/数组)都将按值传递。但是,如果您创建一个 get/set 函数,您可以传递绑定到对象的函数。
var obj = {
_val: 0,
val: function(x) {
if (x !== undefined) {
this._val = x;
} else {
return this._val;
}
}
}
function doStuff(prop) {
if (prop() > 1) {
prop(0);
}
}
doStuff(obj.val.bind(obj));
你总是可以传递两个参数,对象和属性名:
function change(obj, prop, newVal) {
obj[prop] = newVal;
}
var obj = { foo: 1 };
change(obj, 'foo', 99);
console.log(obj); // => { foo: 99 }
简短的回答是否定的,因为正如您在问题中已经提到的,原始类型是按值传递的。
有一个有趣的 SO answer详细解释了它,还链接到了非常详细的博客文章。
但是,如果您确实需要这样做,您可以为您尝试传递的特定属性创建一个包装器对象,但这不仅仅是一种解决方案,而是一种解决方法。