javascript 中的对象
对象是javascript的基本数据类型。对象是一种复合值:它有很多值(原始值 或则其他对象)聚合在一起,可通过名字来访问这些值。对象也可以看做是属性的无序集合,每个属性都是一个名值对。属性名是字符串,因此我们可以吧对象看成是字符串到值的映射。然而对象不仅仅是字符串到值的映射,除了保持自有属性javascript还可以从一个称为原型的对象继承属性,对象的方法通常是通过继承的属性 。 这种原型式继承是javascript的核心特征。
javascript中的对象是动态的(可以新增属性也可以删除属性)但他们常用来模拟静态对象以及静态语言中的结构体,有时也用作字符串的集合
除了字符串,数字,true,false,null,undefined,之外javascript中的值都是对象 但是尽管字符串,数字和布尔值不是对象但他们和不可变的对象非常类似
对象是可变的,他们通过应用而非值来操作对象,如果变量X是指向一个值的引用,那么执行代码 var y =x;变量y也是指向同一个的对象的引用,而非这个对象的副本。通过变量y来修改这个对象也会对变量x造成影响
对象的常用的方法是 创建(create) 设置(set) 查找(query) 删除(delete) 检测(test) 和枚举(enumeration)它的属性
对象的属性包括名字和值,属性名可以是包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性。
对象的属相特性
可写 :表示可以设置该属性的值
可枚举 :表明是否可以通过 for/in循环返回该属性
可配置 :表明是否可以删除和修改该属性
对象的对象特性
对象的原型(prototype)指向另外的一个对象,本对象的属性继承自它的原型对象
对象的类(class) 是一个标识对象类型的字符串
对象的扩展标记(extensible flag)指明了是否可以向该对象添加新属性
三类对象和两类属性的区分
内置对象(native object)是由ECMAscript规范定义的对象或类 例于:数组,函数,日期,和正则表达式都是内置对象
宿主对象(host object)是由javascript解释器所嵌入的宿主环境,客户端javascript中表示网页结构的HTMLElement对象均是数组对象
自定义对象(user-defined object)是由运行在javascript 代码创建的对象
自有属相(own property)是直接在对象中定义的属性
继承属性(inherit property)是在对象的原型对象中定义的属性
创建对象
对象直接量创建对象
创建对象最简单的方法就是在javascript 代码中使用直接量。对象直接量是由若干名值对组成的映射表。对象直接量是一个表达式,这个表达式的每次运算都创建并初始化一个新的对象。每次计算对象直接量时候,也都会计算他它的每个属性的值,也就是说,如果在一个重复调用的的函数中的循环中的循环体内使用了直接量,他将创建很多新对象,并且每次创建的对象的属性值也可能不同
var empty={}; //没有任何属性的对象 var point = {x:0,y:0} //两个属性 var point2={x:point.x , y:poimt.y+1}
通过new创建对象
new运算符创建并初始化一个新对象,关键字new后跟随一个函数调用,这里的函数称做构造函数,构造函数用以初始化一个新创建的对象,javascript语言核心中的原始类型包含内置的构造函数
var a = new Object(); //创建一个空对象 var b = Array(); //创建一个空数组
Object.create()
ECMAscript 5 定义了一个名为Object.create()的方法,它创建一个新对象,其中第一个参数就是对象的原型,Object.create()提供第二个可选参数,用以对该对象的属性进行进一步的描述
object.create()是一个静态函数,而不是提供给某个对象调用方法,使用它的方法很简单,只需传入所需的原型对象即可
var o1 = object.create({ x:1,y:2 }) //o1继承了属性x 和 y
可以通过传入参数 null 来创建一个没有原型的新对象,但是通过这种方法创建的对象不会继承任何东西。甚至不包括基础方法,比如说toString()
如果想要创建一个普通的空对象(比如说通过 { } 或 new Object() 创建的对象)则需要传入Object,prototype;
var o3 = object.create( Object.prototype ); //o3和new Object()创建的对象一样;
可以通过任意原型创建新对象(换句话说,可以使用任意对象可继承 ) 这是一个非常强大的特性
//inherit() 返回一个继承自原型对象p的属性的新属性 //这里使用了ECMAscript 5中object.create()函数 //如果不存在object.create()方法则退化使用其他方法 function inherit(p){ if(p==null)throw TypeError();//p是一个对象,但不能是null if( Object.create) //如果object.create()存在 return Object.create(p);//直接使用 var t = typeof p; //否则进一步检测 if ( t !=="object" && t !== "function") throw TypeError(); function f(){}; //定义一个空的构造函数 f.prototype = p; //将其原型属性设置为P return new f(); //使用f()创建P的继承对象 }
inherit()函数的其中一个用途就是防止库函数无意间(非恶意)修改那些不受你控制的对象。不是将对象直接作为参数传入函数。当函数读取继承对象属性时,实际上读取的是继承来的值,如果给继承对象的属性赋值,则这些属性智慧影响这个继承对象自身,而不是原始对象。
对象原型
每一个javascript对象(null 除外) 都和另一个对象相关联,其中另一个对象就是我们所熟知的原型,每一个对象都从原型继承属性
1 所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过javascript代码Object.prototype获得对象原型的引用
2 通过关键字new和构造函数调用创建对象的原型就是构造函数的prototype属性的值
没有原型的对象为数不多,object.prototype就是其中之一,他不继承任何属性。其它的原型对象都是普通对象,普通对象都具有原型。