详解JavaScript对象类型(3)

// 使用方括号启示访问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。
 以下是示例:
  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzsxyd.html