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