Javascript 对类对象属性的引用

Javascript 对类对象属性的引用,javascript,Javascript,我有一个属性为this.eyes的类。代码如下。正如您在第一种情况下在第二个引用中的data.num保存值中所看到的。在我的项目中,我不需要数组,所以我需要以某种方式制作第一个样本来保存引用,就像第二个一样。知道怎么做吗 //警告!伪码 //样本一 阶级人{ 构造函数(){ this.eyes=null; } addEye(){ 这个。眼睛=1; } } 康斯特·威廉=新人类(); 常量数据={num:william.eyes} 威廉·阿德耶(); //数据={num:null} //警告!伪

我有一个属性为this.eyes的类。代码如下。正如您在第一种情况下在第二个引用中的
data.num
保存值中所看到的。在我的项目中,我不需要数组,所以我需要以某种方式制作第一个样本来保存引用,就像第二个一样。知道怎么做吗

//警告!伪码
//样本一
阶级人{
构造函数(){
this.eyes=null;
}
addEye(){
这个。眼睛=1;
}
}
康斯特·威廉=新人类();
常量数据={num:william.eyes}
威廉·阿德耶();
//数据={num:null}
//警告!伪码
//样本一
阶级人{
构造函数(){
this.eyes=[];
}
addEye(){
这个。眼睛。推(1);
}
}
康斯特·威廉=新人类();
常量数据={num:william.eyes}
威廉·阿德耶();

//data={num:[1]}
如果我正确地理解了您在这里试图做的事情,以下内容应该对您有用:

class Human {
  constructor() {
    this.eyes = 0;
  }

  addEye() {
    this.eyes += 1;
  }
}

JavaScript有一小部分内置类型,其中一个是
number
,它是一种“值类型”(据我所知,你的
human.eyes
值总是
null
number
值)

JavaScript不支持对
number
值的引用,因此在此之后
data={num:william.eyes}
data.num
值将是
william.eyes
的副本,而不是您正确猜测的引用

但是,JavaScript确实支持具有自定义getter/setter逻辑(
Object.defineProperty
)的非平凡属性。您可以将其与对
william
对象的引用结合使用,以获得所需的行为:

const william = new Human();
const data = {}; // new empty object
Object.defineProperty( data, 'num', {
    enumerable: true,
    configurable: true,
    writable: true,
    get: function() { return this.human.eyes; },
    set: function(newValue) { this.human.eyes = newValue; }
} );
// Need to give `data` a reference to the `Human`:
data.human = william;

william.addEye();
william.addEye();

console.log( data.num ); // outputs "2"
data.num++;
console.log( william.eyes ); // outputs "3"

我认为你的
addEye()
函数应该是
this.eyes+=1
而不是
this.eyes=1
。如果你想
数据在调用
william.addEyes()
后自动更新,那么
william
addEyes()
将需要引用
数据
,因为它不在
人员
的范围内。