我有一个非常简单的JavaScript问题......
我有一个函数 Pets ,它包含三个变量:整数,字符串和定义如下的数组:
function Pets() {
var index;
var name;
var animals = ["cat", "dog"];
}
在另一个函数中,我声明了一个类型为 Pets 的变量,并推送" mouse"到 animals 数组。然后我做一个控制台日志来查看值。
function Test() {
...
var pets = new Pets();
pets.index = 1;
pets.name = "My Pets";
pets.animals.push("mouse");
console.log(pets);
}
无论出于何种原因,我都没有从控制台看到任何输出。
然后我在调用animals.push:
之前和之后添加了一些控制台记录 var pets = new Pets();
pets.index = 1;
pets.name = "My Pets";
console.log("BEFORE PUSH");
console.log(pets);
pets.animals.push("mouse");
console.log("AFTER PUSH");
这是我的输出:
BEFORE PUSH
Pets {index: 1, name: "My Pets"}
请注意,我只看到第一个控制台日志,而不是第二个(推送后),我认为这表示调用 animals 上的推送有问题。
另请注意,控制台输出显示Pets有一个名为 index 的属性和一个名为 name 的属性,但它没有表明还有一个名为动物这是我的阵容。
我尝试将数组声明更改为:
var animals = new Array();
但这似乎也无济于事。
在我将元素推送到它之前,我是否需要做一些特殊的事情来初始化animals数组?更一般地说,为什么房产动物甚至不会出现在Pets类的一部分?
谢谢,
扬
答案 0 :(得分:2)
您正在以不会在Pets
构造函数
这就是为什么你没有看到第二个控制台,因为行
pets.animals.push("mouse");
将抛出错误 TypeError:无法读取未定义的属性'push'(或取决于浏览器的类似情况)。这将导致脚本的其余部分停止执行。
您在第一个控制台日志中看到index
和name
的唯一原因是您在创建Pets对象后在对象上创建它们。您需要使用this
运算符或在原型
function Pets() {
this.index = null;
this.name = null;
this.animals = ["cat", "dog"];
}
答案 1 :(得分:0)
您是否尝试在声明期间将变量分配给窗口而不是使用var?设置它像window.myVar = [“var1”,“var2”]
答案 2 :(得分:0)
您无法以这种方式访问Pets的任何属性,因为它们不会暴露于外部功能。您正在通过说
来创建属性索引和名称pets.index = ...
你必须改变你的代码:
function Pets() {
this.index;
this.name;
this.animals = ["cat", "dog"];
}
function Test() {
var pets = new Pets();
pets.index = 1;
pets.name = "My Pets";
pets.animals.push("mouse");
console.log(pets);
}
Test();