// 使用方括号启示访问book对象的属性: console.log ( book["title"]); //Ways to Go console.log ( book["pages"]); // 280 //如果属性名储存在一个变量当中,也可以这样: var bookTitle = "title"; console.log ( book[bookTitle]); // Ways to Go console.log (book["bookMark" + 1]); // Page 20
访问一个对象中不存在的属性会得到一个undefined。
自身属性和继承属性
对象拥有自身属性和继承属性。自身属性是直接定义在对象上的属性,而继承属性是从Object的Prototype继承的属性。
为了确写一个对象是否拥有某个属性(不管是自身属性还是继承属性),可以使用in操作符:
// 创建一个有schoolName属性的对象 var school = {schoolName:"MIT"}; // 打印出true,因为对象拥有schoolName这个属性 console.log("schoolName" in school); // true // 打印出false,因为我们既没有定义schoolType属性,也没有从Object的Prototype中继承schoolType属性 console.log("schoolType" in school); // false // 打印出true, 因为从Object的Prototype中继承了toString方法 console.log("toString" in school); // true
hasOwnProperty
为了确定一个对象是否拥有一个特定的自身属性,可以使用hasOwnPrototype方法。这个方法十分有用,因为我们经常需要枚举一个对象的所有自身属性,而不是继承属性。
// 创建一个拥有schoolName属性的对象 var school = {schoolName:"MIT"}; // 打印出true,因为schooName是school的自身属性 console.log(school.hasOwnProperty ("schoolName")); // true // 打印出false,因为toString是从Object的Prototype中继承下来的,并且school的自身属性 console.log(school.hasOwnProperty ("toString")); // false
访问和枚举对象中的属性
为了访问对象中可以枚举的属性(自身或者继承的),可以使用for-in循环或普通的循环方式。
// 创建拥有3个属性的school对象: schoolName, schoolAccredited, and schoolLocation. var school = {schoolName:"MIT", schoolAccredited: true, schoolLocation:"Massachusetts"}; //使用for-in循环获取对象中的属性 for (var eachItem in school) { console.log(eachItem); // Prints schoolName, schoolAccredited, schoolLocation }
访问继承的属性
从Object的Prototype中继承的属性不可枚举的,所以在for-in循环中不会访问到这些属性。然而,如果是可枚举的继承属性,它们也是能够从for-in循环中访问到的。
比如:
//使用for-in循环访问school对象中的属性 for (var eachItem in school) { console.log(eachItem); // Prints schoolName, schoolAccredited, schoolLocation } // 注:以下这段说明是原文的说明 /* SIDE NOTE: As Wilson (an astute reader) correctly pointed out in the comments below, the educationLevel property is not actually inherited by objects that use the HigherLearning constructor; instead, the educationLevel property is created as a new property on each object that uses the HigherLearning constructor. The reason the property is not inherited is because we use of the "this" keyword to define the property. */ // Create a new HigherLearning function that the school object will inherit from. function HigherLearning () { this.educationLevel = "University"; } // Implement inheritance with the HigherLearning constructor var school = new HigherLearning (); school.schoolName = "MIT"; school.schoolAccredited = true; school.schoolLocation = "Massachusetts"; //Use of the for/in loop to access the properties in the school object for (var eachItem in school) { console.log(eachItem); // Prints educationLevel, schoolName, schoolAccredited, and schoolLocation }
删除对象中的属性
可以使用delete操作符来删除对象中的属性。我们不能删除继承的属性,同时也不能删除Configurable特性被设置为false的对象属性。要删除继承的属性,必须从Prototype对象中删除(也就是定义这些属性的地方)。并且,我们也不能删除全局对象中的属性。
删除成功的时候,delete操作符会返回true。令人意外的是,当要删除的属性不存在,或者不能被删除(即不是自身的属性或者Configurable特性被设置为false)时, delete操作符也会返回true。
以下是示例: