一、认识JavaScript对象和属性
对象是javascript的基本数据类型,对象是一种复合值:他将很多值(原始值或其他对象)聚合在一起,可以通过名字访问这些值。对象也可以看作是属性的无序集合,每个属性都是一个名值对。属性名是字符串,因此我们可以把对象看成是:从字符串到值的映射。
对象是可变的,我们通过引用非值来操作对象,如果变量x指向一个对象的引用,那么执行代码:var y=x;变量y也是指向同一个对象的引用,而非这个对象的副本,通过变量y修改这个对象亦会对变量x造成影响。
属性包括名字和值,属性名可以是包含空字符串在内的任意字符串,但对象中不能同时存在两个同名的属性,属性值可以是任意的JavaScript值(在ECMAScript5中:可以是getter函数和setter函数或两者都有 )。
除了名字和值外,每个属性还有一些与之相关的值,称为"属性特性":
1、可写(writeable),表明是否可以设置该属性的值。
2、可枚举(enumerable),表明是否可以通过for/in循环返回该属性。
3、可配置(configurable),表明是否可以删除或修改该属性。
在ECMAScript5之前,通过代码给对象创建的所有属性都是:可写的 、可枚举和可配置的。在ECMAScript5中则可以对这些特性加以配置。
JavaScript对象用有三个相关的对象特性:
1、对象原型(prototype),对象原型指向另外一个对象,本对象的属性继承自它的原型对象。
2、对象的类(class),对象的类是一个标示对象类型的字符串。
3对象的扩展标记(extensible flag) 指明了是否可以向该对象添加新的属性。
JavaScript中的三类对象:
1、内置对象,是由ECMAScript规范定义的对象或类。如:数组、函数、日期、正则表达式,这些都是内置对象。
2、宿主对象,是由Javascript解释器所嵌入的宿主坏境(如Web浏览器)定义的。客户端JavaScript中表示网页结构的HTMLElement对象均是宿主对象,宿主对象也可以当成内置对象。
3、自定义对象,是由Javascript运行的的代码创建的对象。
JavaScript两类属性:
1、自有属性,是直接在对象中自定义的属性。
2、继承属性,是继承自原型对象中定义的属性。
二、JavaScript对象的三种创建方式
1、对象直接量
var empty={}; //没有任何属性的对象
var point={x:0,y:1}; //两个属性
var point2={x:point.x,y:point.y+1}; //更复杂的属性值
var book={
"main title":"JavaScript", //属性名字有空格,属性名必须用字符串表示 和访问
"sub-title":"The Definitive Guide", //属性名字有连字符,属性名必须用字符串表示和访问
"for":"all andiences:, //"for"是保留字,必须用引号
author:{ //这个属性的值是一个对象
firstName:"yang", //注意,这里的属性名没有引号
surname:"zhang"
}
};
2、通过new创建对象
new运算符跟随一个构造函数,初始化一个新创建的对象,JavaScript语言核心中的原始类型都包含内置构造函数。
var myDate=new Date();
var arr=new Array();
var reg=new RegExp("JavaScript");
var obj=new Object();
obj.name="yang";
obj["sex"]="男";
obj.run=function(){
return this.name+"-"+this.sex;
};
3、Object.create()
ECMAScript5定义了一个名为Object.create()的方法创建一个新对象,第一个参数是这个对象的原型,第二个参数可选参数,是对对象属性进行的进一步描述。
var obj1=Object.create({x:1,y:2}); //obj继承了原型对象中的属性x和属性y
var obj2=Object.create(null); //obj2不继承任何属性和方法,包括基础方法如:toString().
var obj3=Object.create(Object.prototype);//创建一个普通的对象和{}一样
通过原型继承创建一个新的对象
function inherit(p){
if(p==null) throw TypeError();
if(Object.create){
return Object.create(p);
}else{
var t=typeOf p;
if(t!=="object" && t!=="function"){
throw TypeError();
}else{
function f(){};
f.prototype=p;
return new f();
}
}
}