有人可以向我解释一下吗?
这有效:
function Pin() { };
function Pi() { };
function User() { };
var PiArray = [];
var PinArray;
for (var i = 0; i < 2; i++) {
PiArray[i] = new Pi();
PiArray[i].Name = '';
PiArray[i].PinArray = [];
for (var j = 0; j < 25; j++) {
PiArray[i].PinArray[j] = new Pin();
PiArray[i].PinArray[j].Number = j + 2;
PiArray[i].PinArray[j].PulseWidth = 0;
PiArray[i].PinArray[j].PulseFrenquency = 0;
PiArray[i].PinArray[j].Dirtybit = false;
};
}
/* Output is
[{"Name":"","PinArray":[{"Number":2,"PulseWidth":0,"PulseFrenquency":0,"Dirtybit":false},{"Number":3,"PulseWidth":0,"PulseFrenquency":0,"Dirtybit":false},{"Number":4,"PulseWidth":0,"PulseFrenquency":0,"Dirtybit":false},
etc.
*/
但是我无法弄清楚如何将它变成一个对象,变量的范围不像我期望的那样。
这就是我尝试过的一个例子:
function Pin() { };
function Pi() { };
var User = (function () {
PiArray = [];
function User() {
var PinArray;
for (var i = 0; i < 2; i++) {
PiArray[i]= new Pi();
PiArray[i].Name = '';
PiArray[i].PinArray = [];
for (var j = 0; j < 25; j++) {
PiArray[i].PinArray[j] = new Pin();
PiArray[i].PinArray[j].Number = j + 2;
PiArray[i].PinArray[j].PulseWidth = 0;
PiArray[i].PinArray[j].PulseFrenquency = 0;
PiArray[i].PinArray[j].Dirtybit = false;
};
}
}
console.log(JSON.stringify(PiArray));
return User;
})();
new User();
,输出为:
[ ]
我不明白为什么?
答案 0 :(得分:3)
你的console.log(JSON.stringify(PiArray));
在第二种情况下显示一个空数组,因为在它运行时,你还没有调用函数User()
。 IIFE只定义函数User()
然后返回它。它实际上并没有称之为。
您之后的代码new User()
确实在调用它,但是在console.log()
已经执行之后就已经过了。
将console.log()
移动到User()
函数定义的末尾(但在函数内),您将看到预期的值。
function Pin() { };
function Pi() { };
var User = (function () {
PiArray = [];
function User() {
var PinArray;
for (var i = 0; i < 2; i++) {
PiArray[i]= new Pi();
PiArray[i].Name = '';
PiArray[i].PinArray = [];
for (var j = 0; j < 25; j++) {
PiArray[i].PinArray[j] = new Pin();
PiArray[i].PinArray[j].Number = j + 2;
PiArray[i].PinArray[j].PulseWidth = 0;
PiArray[i].PinArray[j].PulseFrenquency = 0;
PiArray[i].PinArray[j].Dirtybit = false;
};
}
console.log(JSON.stringify(PiArray));
}
return User;
})();
new User();
仅供参考,目前还不清楚您要使用此结构完成什么,因为PiArray
只能从您的构造函数中获取。一旦调用了构造函数,就没有其他代码可以访问它或使用它。加上对构造函数的所有调用都将修改相同的PiArray
。在此上下文中,PiArray
的工作方式类似于静态类(因为该术语在其他语言中使用)。它是类的所有实例共享的公共变量,但不能在对象本身的代码之外访问。
如果您在User
对象上有其他方法,那么他们也可以访问PiArray
,并且拥有它可能更有意义。
您可以创建一个存储有不同数组的实例,如下所示:
var MyObj = function(data) {
// assign a copy of the passed-in array as instance data
// You don't have to make a copy - you could just assign in incoming array
this.data = data.slice(0);
}
var x = new MyObj([1,2,3]);
var y = new MyObj([9,8,7]);
console.log(x.data); // [1,2,3]
console.log(y.data); // [9,8,7]