对象的介绍
对象是一种复合值,他将很多值聚合在一起,可通过名字访问这些值。
对象也可看作是属性的无序集合,每个属性都是一个名/值对。属性名是字符串,因此我们可以把对象看成是从字符串到值的映射。然而对象不仅仅是字符串到值的映射,除了可以保持自有的属性,js对象还可以从一个称为原型的对象继承属性。对象的方法通常是继承的属性。这种“原型式继承”是js的核心特征。
js对象是动态的,可以新增属性也可以删除属性,但他们常用来模拟静态对象以及静态类型语言中的‘结构体’。除了字符串,数字,true,false,null,undefined之外,js中的值都是对象。
js对象每个属性还有一些与之相关的值,称为‘属性特征’:
- 可写 (表明是否可以设置该属性的值)
- 可枚举 (表明是否可以通过for/in循环返回该属性)
- 可配置 (表明是否可以删除或修改该属性)
es5之后对这些特性加以配置:
- 对象的原型 (指向另外一个对象,本对象的属性继承自它的原型对象)
- 对象的类 (是一个标识对象类型的字符串)
- 对象的扩展标记 (指明了是否可以向该对象添加新属性)
js对象分为3类,对象属性分为两类
- 内置对象 (是由es规范定义的对象或类。例如数组,函数,日期和正则表达式都是内置对象)
- 宿主对象 (是由js解释器所嵌入的宿主环境定义的,例如xxx浏览器。客户端js中表示网页结构的HTMLElement对象均是宿主对象。既然宿主环境定义的方法可以当成普通的js函数对象,那么宿主对象也可以当成内置对象。)
- 自定义对象 (是由运行中的js代码创建的对象)
- 自有属性 (是直接在对象中定义的属性)
- 继承属性 (是在对象原型中定义的属性)
创建对象
对象直接量
var empty = {} //空属性对象
var point = {x:0,y:0} //两个属性
var point = {x:point.x,y:point.y} //更复杂的值
var book = {
"main title":"string", //属性中有空格必须用字符串表示
"sub-title":"string", //属性中有连字符必须用字符串表示
author:{ //属性的值可以是一个对象
firstname:"dave"
}
fun:()=>{ //属性的值可以是函数
console.log(1)
}
}
使用保留字当属性时,最好用引号引起来(否则在es3将出错)。
通过new创建
new运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。这里的函数称作构造函数,构造函数用以初始化一个新创建的对象。js语言核心中的原始类型都包含内置构造函数。
var o = new Object() //创建一个空对象,和{}一样
var a = new Array() //创建一个空数组,和[]一样
function Obj(){
this.age = 18;
}
//不用new
console.log(Obj()); // undefined
//用new
console.log(new Obj()); //Obj {age: 18}
Object.create()
在介绍Object.create()之前,先了解下原型。每一个js对象(null除外)都和原型关联,每一个对象都从原型继承属性。
object.create()是一个静态函数,而不是提供给某个对象调用的方法。使用它的只用传入所需的原型对象即可:
var o1 = Object.create({x:1,y:2}); //o1继承了属性x和y
var o2 = Object.create(null) //不继承任何东西,甚至不包括基础方法,包括toString(),他将不能和+运算符一起正常工作
var o3 = Object.create(null) //创建普通的空对象
属性的查询和设置
//查询
var book= {author:"been",surname:"foo",title:"title"}
var author = book.author // 'been'
var name = author.surname // 'foo'
var title = book['title'] // 'title'
//设置
book.edition = 6
book["main"]= 'es'
继承
var o={}
o.x=1
var p=Object.create(o)
p.y=2
var q=Object.create(p)
console.log(q)//q的x和y分别继承自o和p
删除属性
delete可以删除对象的属性,但不可以删除可配置型为false的属性。
属性的getter和setter
对象属性是由名字,值构成的,可以用getter和setter替代。
var p={
x:1,
y:1,
get r(){return Math.sqrt(this.x*this.x+this.y*this.y)},
set r(newvalue){
var oldvalue=Mathsqrt(this.x*this.x+this.y*this.y)
var ratio=newvalue/oldvalue
this.x*=ratio
this.y*=ratio
}
}
p.r //1.7...
p.r=5 //p {x:3.5...,y:3.5...}
属性的特征
//获得某个对象特定属性的属性描述符,对于继承属性和不存在的属性返回undefined
Object.getOwnPropertyDescriptor({x:1},"x") //{configurable:trueenumerable:truevalue:1writable:true}
//设置属性的特性
var o={}
Object.defineProperty(o,"x",{value:1,writable:true,enumerable:false,configurable:true})
//属性存在却不可配置
o.x //1
Object.keys(o) //[]
对象方法
- toString (返回一个表示调用这个方法的对象值的字符串)
- toLocaleString (同toString,除了数字和时间做了本地化转换)
- valueOf (将对象转换为原始值,原始值返回原始值)