本质上,我希望能够通过引用访问对象的属性。看看下面的代码;
class Point{
x:number;
y:number;
constructor(x,y)
{
this.x=x;
this.y=y;
}
}
const a = { first: new Point(8,9), second: new Point(10,12) };
let someBool = true;
function modifyProperty(a) {
let c = someBool? a.first: a.second;
let newPoint = new Point(0,0);
c = newPoint; // Doesn't work
someBool = !someBool;
}
modifyProperty(a);
console.log(a.first);
在此示例中,每当我调用ModifyProperty()时,我都希望在更改'a'中的两个属性之一之间进行切换。
但是,当我将'c'分配给'a.first'或'a.second'时,它仅按值传递。我想解决此问题的唯一方法是使属性本身成为对象,例如:
const a = { first: {value: new Point(8,9)}, second: {value: new Point(10,12)} };
然后我将仅呼叫c.value = newPoint
。这会起作用,但这不是一个好的解决方案,因为您必须对对象中的每个属性执行此操作。
没有更好的方法来通过引用获取这些属性吗?我知道JS仅支持对象和数组的按引用传递,但是类的实例呢?
我知道当Babel将类转换为普通Javascript时,会将它们视为函数,但是函数不是原始类型-它是可调用的对象,所以行不通,什么是解决方案?
答案 0 :(得分:1)
但是,当我将'c'分配给'a.first'或'a.second'时,它仅按值传递
是的,赋值总是会更改=
左侧的事物的值,
无法在Javascript或TypeScript中对其进行更改。
一种解决方法是将属性名称与该属性所属的对象一起使用,而不是引用:
type Pair<T> = { first: T, second: T }
function modifyProperty(a: Pair<Point>) {
let c: keyof Pair<Point> = someBool? 'first' : 'second';
// keyof Pair<Point> type annotation means
// that only property names of Pair could be assigned to c
let newPoint = new Point(0,0);
a[c] = newPoint;
someBool = !someBool;
}