我理解javascript,primitives are passed by value and objects are passed by reference。
我有兴趣创建一种可以让我获得对包含基元的对象属性的引用的解决方法。例如,我希望工作的是:
var someObject = {a: 1, b: 2};
var myRef = someObject.b;
myRef ++;
someObject.b #=> 3
当然,这不起作用。我知道你可以创建一个getter和setter函数,或者使用一个对象来引用另一个对象,但我真正喜欢的是某种变通方法允许我将变量定义为对属性的引用另一个目标,到目前为止似乎无法完成。
所以,我的问题很简单:这是否可能,如果是这样,怎么样?
答案 0 :(得分:2)
原始类型是不可变的,所以不,这是不可能的。您可以使用对象包装基本类型,如下所示:
function MyNumber(n) { this.n = n; }
MyNumber.prototype.valueOf = function() { return this.n; }
var someObject = { a: 1, b: new MyNumber(2) };
var myRef = someObject.b;
MyNumber.call(myRef, myRef + 1);
console.log(+someObject.b); // convert to number with +
OR
var someObject = {
a: { value: 1 },
b: { value: 2 },
};
var myRef = someObject.b;
my_inc(myRef); // function my_inc (obj) { obj.value++; }
// someObject.b.value == 3
React框架使用非常简单的模式来封装值。
function Link(value, requestChange)
{
this.value = value;
this.requestChange = requestChange;
}
您可以传递对象,可以通过检查对象的value属性来访问当前值,如果要更改它,可以使用新值调用requestChange
,您可以更改该值。优点是具有实际的“存储位置”和用于将值与读取和写入访问值分离的逻辑。请注意,值也可以是复杂对象。
你也可以用闭包来实现类似的东西:
var someObject = {
a: 1,
b: 2
};
function property(object, prop) {
return {
get value () {
return object[prop]
},
set value (val) {
object[prop] = val;
}
};
}
var ref = property(someObject, "b");
ref.value; // 2
++ref.value; // 3
someObject.b; // 3
这是有效的,因为getter和setter函数可以访问创建时范围内的任何绑定(object
和prop
)。您现在可以传递ref
,将其存储在数据结构中等等。
答案 1 :(得分:0)
不,没有一个好方法可以做到。
如果您愿意,可以使用解决方法。类似于使用单个元素数组包装所有主要数据类型的东西:
var someObject = {a: [1], b: [2]};
var myRef = someObject.b;
myRef[0]++;
someObject.b[0]; // 3
但这不太理想,因为您必须始终使用[0]
来访问该属性。在某些情况下,它可能很有用,单个元素数组的默认toString
只是其元素的toString
,因此您可以直接在字符串上下文中使用该属性:
console.log('My value: ' + someObject.b); // 'My value: 3'
答案 2 :(得分:-1)
我不知道这是多么令人满意,但如果您可以将所需对象包裹在这样的对象中,则可以这样做:
var a = {a:{a:1},b:2};
var b = a.a;
b.a++;
a.a.a //=> 2
它并不完全符合您的要求,但它会起作用。