Javascript访问器属性混淆

Javascript访问器属性混淆,javascript,properties,accessor,Javascript,Properties,Accessor,我不知道为什么这个代码会给我一个错误。我要做的就是创建一个对象,该对象将数组作为属性。我想用setter和getter实现这一点,但由于某种原因,当我在setArray函数中执行this.array=[]时,我得到了超过最大调用堆栈大小的。我做错了什么?关于Javascript的访问器属性,我缺少什么 var obj = { set array(size) { this.array = []; for (var i = 0; i < size; i++){

我不知道为什么这个代码会给我一个错误。我要做的就是创建一个对象,该对象将数组作为属性。我想用setter和getter实现这一点,但由于某种原因,当我在setArray函数中执行
this.array=[]
时,我得到了超过最大调用堆栈大小的。我做错了什么?关于Javascript的访问器属性,我缺少什么

var obj = {
  set array(size) {
   this.array = [];
   for (var i = 0; i < size; i++){
        this.array[i] = i; 
   }
  }
};


var myObj = Object.create(obj); 
myObj.array = 20; 
var obj={
设置数组(大小){
this.array=[];
对于(变量i=0;i
编写
this.array=[]
时,您正在setter本身内部使用setter。介绍另一个名为
\u array
的成员,并将其填入
array
属性的setter中

var obj = {
  _array: [],
  set array(size) {
   for (var i = 0; i < size; i++){
      this._array[i] = i; 
   }
  }
};


var myObj = Object.create(obj); 
myObj.array = 20; 
var obj={
_阵列:[],
设置数组(大小){
对于(变量i=0;i
您正在从setter中使用setter分配给属性,这就是它永远递归的原因:

var obj = {
    set array(size) {                   // <== The property is called `array`
        this.array = [];                // <== This calls the setter
        for (var i = 0; i < size; i++){
            this.array[i] = i;          // <== This would fail because there's no getter
        }
    }
};
var obj={

set array(size){/您曾提到要使用setter和getter,此代码段仅使用obj.array而不是showArray来查看对象的数组

var obj=(函数(){
var_数组=[];
返回{
获取数组(){
返回数组;
},
设置数组(大小){
_数组=[];
对于(变量i=0;iconsole.log(对象数组)
使用另一个属性在某种程度上否定了使用setter的价值,因为用户可以访问
obj.\u array
。@T.J.Crowder的闭包方法可以实现信息隐藏,如果需要的话。你是对的,我只是指出了技术问题,没有处理代码语义。顺便说一句,我使用TypeScript已经很多年了,而且这里有
private
关键字(我的编码惯例是以下划线开头命名private成员)。这在没有函数调用的情况下是可能的吗?这样我就可以在不将对象设置为函数结果的情况下创建对象?您需要函数闭包来正确隐藏底层数组,或者换句话说,来模拟私有成员的可见性。@YasinYaqoobi:我不确定为什么这样做会有问题?要使用上面真正的私有变量吗,是的,你需要一个函数。但是你可以像佐尔坦那样将数组作为另一个属性存储在对象上。问题是,任何代码都可以在任何地方访问它。问题有多大取决于你,很多人不必担心它,而是使用“它从
开始”
,别管它”约定。如果你这样做,你可能希望另一个属性是不可枚举的,所以它不会出现在JSON之类的东西中。这没有问题。我正在尝试学习所有这些,它只是在一个我已经不确定的概念上增加了另一层复杂性。斗争还在继续:)@YasinYaqoobi:啊,我明白了。顺便说一句,我很抱歉上面的可枚举性错误:即使您使另一个属性不可枚举,它也会显示在
JSON.stringify
的结果中。我对此感到非常惊讶。因此,如果它困扰您,您必须在其上实现
toJSON
,并忽略该属性。“…我想通过setter和getter实现这一点…”你希望getter返回什么?我故意避免在我的答案中包含一个,因为如果它返回一个数组,那么我们有一个非常奇怪的属性,设置时“是”一个数字,但获取时却是一个数组。这通常不理想…:-)