JavaScript语言精粹——对象

JavaScript中简单类型包括数字、字符串、布尔值、null和undefined.除此之外,其他所有值都是对象。
JavaScript中的对象是可变的键控集合,在JavaScript中,数组是对象、函数是对象、正则表达式是对象、对象也是对象...
对象是属性的容器,每个属性都拥有名字和值,属性的名字可以是包括空字符串在内的任意字符串,属性值可以是除undefined值之外的任何值。
JavaScript中的对象是无类别(class-free)的。它对新属性的名字和值没有约束,对象适合用于收集和管理数据。对象可以包含其他对象。
JavaScript包括一个原型链特性,允许对象继承另一对象的属性,正确使用能够减少对象初始化的时间和内存消耗。

1.对象字面量
①对象字面量提供了一种非常方便的创建新对象值的表示法,一个对象字面量就是包围在一对花括号中的零或多个名/值对。对象表达式可以出现在任何允许表达式出现的地方。
var empty_object={};
var stooge={
"first-name":"job",  "last-name":"jim", ege:20
};
②属性名可以是包括空字符串在内的任何字符串,在对象字面量中,如果一个属性名是合法的JavaScript标识符且不是保留字,并不强制要求用引号括住属性名,因此必须用引号括住"first-name",但是否括住first_name是可选的。 
③用逗号分隔多个名值对。对象是可嵌套的。

2.检索
①要检索对象中包含的值,可以采用在[]后缀中括住一个字符串表达式的方式,如果字符串表达式是一个常数,而且它是一个合法的JavaScript标识符而并非保留字,那么也可以用.表示法代替。优先使用.表示法。
stooge["first-name"] 
stooge.age
②当检索一个并不存在的成员元素的值将返回一个undefined值。
③当检索一个undefined值会导致TypeError异常,可以通过&&运算符避免错误。
stooge.equip;//undefined         stooge.equip.model//Error
stooge.equip&&stooge.equip.model;//undefined

3.更新
对象中的值可以通过赋值语句来更新,如果属性名已经存在于对象中,那么这么属性的值将被替换。
stooge['first-name']='john';
如果对象之前并没有拥有那个属性名,那么该属性就被扩充到该对象中。

4.引用
对象通过引用来传递,它们永远不会被拷贝。
var a={},b={},c={};//abc每个都引用一个不同的空对象
a=b=c={};//ab和c都引用同一个空对象

5.原型
①每个对象都连接到一个原型对象,并且它可以从中继承属性,所有通过对象字面量创建间的对象都连接到Object.prototype这个JavaScript中标准的对象。
②当创建一个新对象时,可以选择某个对象作为它的原型。
如为Object增加一个beget方法,这个方法创建一个使用原对象作为其原型的新对象。
if(typeof Object.beget!=='function'){
Object.beget=function(o){
var F=function(){};
F.prototype=o;
return  new F();
     };
}
var another_stooge=Object.beget(stooge);
在对某个对象做出改变时,不会触及到该对象的原型。
③原型连接只有在检索值时才被用到,若尝试获取对象的某个属性值,且该对象没有此属性名,那么JavaScript会试着从原型对象中获取属性值,如果那个原型对象也没有该属性,那么再从它的原型中找,直到终点Object.prototype。如果查找的属性完全不存在于原型链中,那么返回undefined值。这个过程称为 委托
④原型关系是一种动态的关系,如果添加新属性到原型中,该属性会立即对所有基于该原型创建的对象可见。

6.反射
①typeof操作符可以确定对象的属性类型 typeof stooge.age;//'number'
②原型链中的任何属性也会产生一个值。 typeof stooge.constructor; //'function'
③处理这些不需要的属性可以让程序检查并剔除函数值,一般做反射的目标是数据。另外一个方法是使用hasOwnProperty()方法。这个方法不会检查原形链,对象拥有独有的属性将返回true.
stooge.hasOwnProperty('constructor');//false

7.枚举
①for in语句可用来遍历一个对象中的所有属性名,该枚举过程会列出所有属性,包括函数和原型中的属性。
②属性名出现的顺序是不确定的,想要确保属性以特定的顺序出现,最好完全避免使用for in语句,而是创建一个数组,在其中以正确的顺序包含属性名。

8.删除
①delete运算符可以用来删除对象的属性,它将会移除对象中确定包含的属性,不会触及原型链中的任何对象。
②删除对象的属性可能会让来自原型链中的属性浮现出来。

9.减少全局变量污染
JavaScript可以很随意地定义那些可以保存所有应用资源的全局变量,但全局变量削弱了程序的灵活性,所以应该避免。
①最小化使用全局变量的一个方法是在应用中只创建唯一一个全局变量:
var MYAPP{};   MYAPP.stooge={...};MYAPP.flight={....}
该变量此时变成应用的容器,将多个全局变量都整理在一个名称空间将显著降低与其他程序、组件或者库之间产生相互影响的可能性。
使用闭包进行信息隐藏是另外一个有效减少全局污染的方法。




你可能感兴趣的:(JavaScript语言精粹——对象)