Typescript / JSX-通过引用分配类的实例

时间:2018-11-27 20:51:35

标签: javascript typescript pass-by-reference jsx pass-by-value

本质上,我希望能够通过引用访问对象的属性。看看下面的代码;

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时,会将它们视为函数,但是函数不是原始类型-它是可调用的对象,所以行不通,什么是解决方案?

1 个答案:

答案 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;
}