对象
对象是JavaScript的基本数据结构。对象是一种复合值:他将很多值放在一起,通过名字访问这些值
对象除了保持自有的属性,还可以从一个称为原型的对象继承属性
js对象是动态的——可以增属性也可以删除属性——常用来模拟对象及静态类型语言中的结构体
对象常用的用法:创建create,设置(set),查找(query),删除(delete),检测(test),枚举(enumerate)
每个对象有三个对象特性:对象的原型(prototype),类(class),扩展标记(extensible flag)
一.创建对象
1.定义:通过对象直接量,关键字new Object.create()函数创建
2.对象直接量:创建对象最简单的方式就在js中使用对象直接量
通过new创建
var o = new Object();
var a = new Array();
var d = new Date();
var r = new RegExp();
3.原型
原型对象都是普通对象,普通对象都是具有原型
Object.cteate()的方法创建新对象
var o = Object.create({x:1,y:1});//o继承属性x和y
通过原型继承创建新对象
<script type="text/javascript">
// 返回一个继承自原型对象proto的属性的新对象
// 这里可以用到ES5的Object.create()函数
function inherit(proto) {//proto是一个对象,但不能是null
if(proto == null) throw TypeError();//proto是一个对象但不能是null
if(Object.create) return Object.create(proto); //如果Object.create()存在,使用它
var t = typeof proto; //否则进一步检查
if(t!=='object' && t!=='function') throw TypeError();
var F = function() {}; // 定义一个空构造函数
F.prototype = proto; // 将其原型属性设置为proto
return new F(); // 使用F()创建proto的继承对象
}
</script>
二.属性的查询&设置
1.
var author = book.author;//得到book的“author”属性
var title = book["main title"]//得到book的“main title”属性
和 查询属性值的写法一样,通过点和方括号来创建属性或属性赋值,但是在赋值表达式的左侧
book.edition = 6;
book["main title"] = "ECMAScript";
2.作为关联数组的对象
object.property 等效 object["property"]
3.语言有三类:强类型(为所有变量指定数据类型),弱类型(检查的弱,仅能严格区分指令和数据),无类型(不检查 不区分指令和数据)
4.继承
js对象有“自有属性”,也有一些属性是从原型对象继承的
js中只有在查询属性时才会体会到继承的存在,而设置属性则与继承无关,可以有选择地覆盖继承的属性
var unitcircle = { r:1 };//一个用来继承的对象
var c = inherit(unitcircle);//c继承r的属性
c.x =1;c.y =1;//c定义2个属性
c.r = 2;//c覆盖继承来的属性
console.log(unitcircle.r);//=1原型对象没有修改
5.属性访问错误
三.删除属性
1.delete可以删除对象的属性
delete book.author;
delete book["main title"];
delete只能删除自有属性,不能删除继承属性,不能删除那些可配置性为false的属性。
如:通过变量声明和函数声明创建的全局对象的属性,是不可配置的
严格的,delete后有一个分发的操作数(x),会报一个语法错误,因此必须显示指定对象及其属性
delete x;//在严格模式下报语法错误
delete this.x;//正常工作
四.检测属性
1.可以通过in运算符、hasOwnPreperty()和propertyIsEnumerable()方法来完成 判断某个属性是否存在于某个对象
in的左侧是属性名(字符串),右侧是对象。若对象的自有属性或继承属性包含这个属性则返回true
hasOwnPreperty()方法对给定的名字是否是对象的自有属性进行检测,对于继承属性返回false
除了使用in运算符外,另一种判断一个属性是否是undefined的方法“!==”
<script type="text/javascript">
var o = {x:1};
o.x !== undefined;//true o中 有x属性
o.y !== undefined; //false o中没有y属性
o.string !== undefined;//true o继承tostring属性
</script>
有一种情况只能用in不能用上述属性访问的方式。in可以区分不存在的属性和存在但值为undefined的属性
<script type="text/javascript">
var o = {x:undefined};//属性被显式赋值为undefined
o.x !== undefined;//false o中 有x属性但是值为undefined
o.y !== undefined; //false o中没有y属性
"x" in o;//true 属性存在
"y" in o;//false 属性不存在
delete o.x;//删除属性x
"x" in o;//false 属性不再存在
</script>
2."!==”可以区分undefined和null,有时候不用区分
若o中有属性x,且x值不为null或undefined,o.x乘以2,if(o.x != null) o.x *= 2;
若o中有属性x,且x的值不能转换为false,o.x乘以2
若x是undefined、null、false、“ ”、0或NaN,则他不变,if(o.x) o.x *= 2;
五.枚举属性
1.for/in循环可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承的属性),把属性名赋值给循环变量。
2.对象继承的内置方法不可枚举的,但在代码中给对象添加的属性都是可枚举的。
3.定义一些有用的工具函数来操控对象的属性,这些函数用到for/in循环。extend()函数经常出现在js实用工具库中
(用来枚举属性的对象工具函数)
-----------------------------------------
-------------------------------------------
---------------------------------
除了for/in外还定义Object.keys()和Object.getOwnPropertyNames()用以枚举属性名称的函数
Object.keys(),来返回一个数组,这个数组由对象中可枚举的自有属性组成(与key()原理类似)
Object.getOwnPropertyNames()和Object.keys()类似,只是他返回对象的所有自有属性的名称,不仅是可枚举的属性。
六.属性getter和setter
1.getter和setter定义的属性称为“存取器属性”,他不同于数据属性(数据属性可有一个值有可写性)
同时又getter和setter则他是一个读/写属性。
若他只是getter,则他是一个只读属性
若他只是setter,则他是一个只写属性,读取只写属性总返回undefined
get和set使用的时候注意
getter和setter中this是关键字
七.属性的特性
1.数据属性的4个特性:他的值value,可写性writeable,可枚举性enumerable,可配置性configurable
存取器没有value和writeable,所以只有读取get和写入set
2.调用Object.getOwnPropertyDescriptor()可以获取某个对象特定属性的描述值
八.对象三个属性
1.对象的原型属性用来继承属性的——“o的原型”
isPrototypeOf()函数实现的功能和instanceof运算符类似
2.类属性
对象的类属性是一个字符串,用来表示对象的类型信息
想获取对象的类,调用对象的toString()方法。
classof()函数可以返回传递给他的任意对象的类
自定义的类,没法通过属性来区分对象的类
3.可扩展性
对象的可扩展性用来表示是否可以给对象添加新属性
通过将对象传入Object.esExtensible()来判断该对象是否可扩展。调用Object.preventExtensions()将对象转换为不可扩展
可扩展性目的是将对象锁定,避免外界的干扰
九.序列化对象
1.定义:将对象的状态转换为字符串,也可以将字符串还原为对象
内置函数JSON.stringify()和JSON.parse()用来序列化和还原js对象。这些方法都使用JSON作为数据交换格式
o = {x:1,y:{z:[false,null,""]}};//定义一个对象 s = JSON.stringify(o); p = JSON.parse(s);//p是s的深拷贝
十.对象方法
1.所有对象都从Object.prototype继承属性
2.toString()方法,没有参数,返回一个表示调用这个方法的对象值得字符串。在需要将对象转换为字符串的时候,js调用
3.toLocaleString()方法,返回一个表示这个对象的本地化字符串
4.toJSON()方法
如Date.toJSON()
5.valueOf()方法