JavaScript:The Good Parts(三)
第3章 对象(Object)
3.1 对象字面量(Object Literals)
3.2 检索(Retrieval)
3.3 更新(update)
3.4 引用(Reference)
3.5 原型(Prototype)
3.6 反射(Reflection)
3.7 枚举(Enumeration)
3.8 删除(Delete)
3.9 减少全局变量的污染(Global Abatement)
JS的简单类型包括:数字、字符串、布尔值、null值和undefined值。其他所有的值都是对象。数字、字符串和布尔值“貌似”对象,因为它们拥有方法,但它们是不可变的。
JS中的对象是可变的键控集合。在JS中,数组是对象,函数是对象,正则表达式是对象,当然,对象自然是对象。对象是属性的容器,其中每个属性都拥有名字和值。属性的名字可以是包括空字符串在内的任意字符串,属性值可以是除undefined值之外的任意值。
JS中对象是无类别的。对象适合用于收集和管理数据。对象可以包含其他对象,所以它们可以很容易地表示成树形或图形结构。JS包括一个原型链特性,允许对象继承另一个对象的属性。正确地使用它能减少对象初始化的时间和内存消耗。
3.1 对象字面量(Object Literals)
(1)对象字面量提供了一种非常方便地创建新对象值的表示法。一个对象字面量就是包围在一对花括号中零或多个“名/值”对。
var empty_object= {};var stooge= { "first-name":"Jerome", "last-name":"Howard"};
var flight={ airline:"Oceanic", number:815, departure: { IATA:"SYD", //IATA:国际航空运输协会 time:"2004-09-22 14:55", city:"Sydney" }, arrival: { IATA:"LAX", time:"2004-09-23 10:42", city:"Los Angeles" }};
stooge["first-name"] //"Jerome" flight.depature.IATA //"SYD"
stooge["middle-name"] //undefined flight.status //undefined,status:状态,订座情况 stooge["FIRST-NAME"] //undefined
var middle= stooge["middle-name"]||"(none)"; var status= flight.status||"unknow";
flight.equipment //undefined,equipment:设施,集装箱 flight.equipment.model //TypeError flight.equipment&&flight.equipment.model //undefined
stooge["first-name"]= "Joe";
stooge["middle-name"]= "Lester"; stooge.nickname= "Curly"; flight.equipment={ model:"Boeing 747" }; flight.status= "overdue"; //overdue:逾期
var x= stooge;x.nickname= 'Curly';var nick= stooge.nickname; //因为x和stooge是指向同一个对象的引用,所以nick为'Curly'var a= {},b= {},c= {}; //a、b和c每个都引用一个不同的空对象var a= b= c= {}; //a、b和c都引用同一个空对象
if(typeof Object.beget!== 'function'){ Object.beget= function(o){ var F= function(){}; F.prototype= o; return new F(); };}var another_stooge= Object.beget(stooge); //创建以stooge对象为原型的新对象another_stooge
another_stooge['first-name']= 'Harry'; another_stooge.nickname= 'Moe'; alert(another_stooge['first-name']+stooge['first-name']+another_stooge.nickname+stooge.nickname); //'HarryJoeMoeCurly'
var stooge.profession= 'actor';another_stooge.profession //'actor'
typeof flight.number //'number'typeof flight.status //'string'typeof flight.arrival //'object'typeof flight.manifest //undefined
typeof flight.toString //'function'typeof flight.constructor //'function'
flight.hasOwnProperty('number') //trueflight.hasOwnProperty('constructor') //false
var name;for(name in another-stooge){ if(typeof another_stooge[name] !== 'function'){ document.writeln(name + ':' +another_stooge[name]); }}
var i;var properties=[ 'first-name', 'middle-name', 'last-name', 'profession'];var length=properties.length;for(i=0;i<length;i +=1 ){ document.writeln(properties[i] + ':' +another_stooge[properties[i]]);}
another_stooge.nickname //'Moe'delete another_stooge.nickname; //删除another_stooge.nickname属性,从而暴露出原型的nickname属性another_stooge.nickname //'Curly'
var MYAPP= {};
MYAPP.stooge= { "first-name":"Joe", "last-name":"Howard"}; MYAPP.flight={ airline:"Oceanic", number:815, departure: { IATA:"SYD", time:"2004-09-22 14:55", city:"Sydney" }, arrival: { IATA:"LAX", time:"2004-09-23 10:42", city:"LAS Angeles" }};