If you're seeing this message, it means we're having trouble loading external resources on our website.

如果你被网页过滤器挡住,请确保域名*.kastatic.org*.kasandbox.org 没有被阻止.

主要内容

复习:对象

以下复习这个有关对象的教程所包括的内容。
我们有很多种值能在 Javascript 变量中存储,而有时候我们要将几个相关的值一起存储:这就是 对象 的用武之地。
对象 是一种让我们在一个变量中存储一组属性的数据类型。为了创建对象,我们跟平常一样声明一个变量,然后把大括号将这些键值属性包裹起来:
var objectName = { 
  propertyName: propertyValue,
  propertyName: propertyValue,
  ...
};
以下是一个描述 Winston 的对象 - 这个对象有两个属性, hometown (故乡)和 hair (头发),而每个属性值都是字符串:
var aboutWinston = {
  hometown: "Mountain View, CA",
  hair: "no"
};
以下是一个描述猫的更复杂的对象,有四个属性 - age (年纪), furColor (毛色), likes (喜好), 和 birthday(生日)。
var lizzieTheCat = {
  age: 18,
  furColor: "grey",
  likes: ["catnip", "milk"],
  birthday: {"month": 7, "day": 17, "year": 1994}
};
请注意每个属性存储一种不同的数据类型 - age 存储数值,furColor 存储字符串,likes 存储数组,而 birthday 存储另外一个对象。这就是对象很酷的地方(其实是酷的地方之一) - 它们可以存储其他对象!因此你可以用深度嵌套的对象来形容复杂的数据。
你还有可能看到对象用双引号放在属性名字的外面来声明,例如:
var aboutWinston = {
  "hometown": "Mountain View, CA",
  "hair": "no"
};
这和我们在前面看到没有引号的方法是一样的结果,但要花更多时间来打字。你唯一必须使用双引号的情况是当属性名含有空格的时候,例如:
var aboutWinston = {
  "his hair": "none"
};
我们在此必须用双引号,不然 Javascript 解释器会感到困惑。这是我给你的建议:属性名字中根本就不要用空格!这样你就永远不需要把属性名放在双引号中了。

调用对象属性

除非我们可以看到并运用对象里的各种值,否则对象是没有用的。我们可以通过两种方式调用对象的属性 - 首先,用所谓的 ”点号记法“:先写变量的名字,然后 ".",然后属性的名字:
var aboutWinston = {
  hometown: "Mountain View, CA",
  hair: "no"
};

text("Winston is from " + aboutWinston.hometown, 100, 100);
text("Winston has " + aboutWinston.hair + " hair", 100, 150);
我们还可以用 “方括号记法”,就像我们调用数组一样:先写变量的名字,然后方括号,里面含双引号抱着属性的名字:
var hisHometown = aboutWinston["hometown"];
var hisHair = aboutWinston["hair"];
如果我们试图调用不存在的属性,我们会看到 "undefined" (未定义)。
text("Winston's life goal is " + aboutWinston.lifeGoal, 100, 150);

修改对象属性

就像我们能在变量中存储其他数据类型,我们可以在程序中用点号或方括号记法随时都可以改变对象属性的值:
aboutWinston.hair = "curly"; // Winston 得到假发
我们还可以加完全新的属性!
aboutWinston.lifeGoal = "teach JavaScript";
如果我们不再要用一个属性,我们可以删掉它(但多数时候我们只需要改变它的值)。
delete aboutWinston.hair;

对象数组

既然你已经了解数组和对象,你可以将它们组合来创建对象数组。它们其实是程序中存储数据的很有用的方法。例如,一个包含“猫”对象的数组:
var myCats = [
  {name: "Lizzie", 
   age: 18},
  {name: "Daemon",
   age: 1}
];

for (var i = 0; i < myCats.length; i++) {
  var myCat = myCats[i];
  println(myCat.name + ' is ' + myCat.age + ' years old.');
}
请注意,我们遍历一个对象数组跟遍历数值或字符串数组一样,用 for 循环。在每次遍历时,我们用方括号记法调用当前的元素,然后用点号记法调用此数组元素(一个对象)的属性。
以下是另一个你有可能会在程序中用的实用例子,一个坐标位置的数组:
var positions = [
    {x: 200, y: 100},
    {x: 200, y: 200},
    {x: 200, y: 300}
];

for (var i = 0; i < positions.length; i++) {
    var position = positions[i];
    ellipse(position.x, position.y, 100, 100);
}
挺棒的,是吧?对象一开始有可能会令人困惑,可你要坚持用,最终你会上瘾而把所有东西都变成对象!

想加入讨论吗?

尚无帖子。
你会英语吗?单击此处查看更多可汗学院英文版的讨论.