JS 对象

对象的介绍
对象是一种复合值,他将很多值聚合在一起,可通过名字访问这些值。
对象也可看作是属性的无序集合,每个属性都是一个名/值对。属性名是字符串,因此我们可以把对象看成是从字符串到值的映射。然而对象不仅仅是字符串到值的映射,除了可以保持自有的属性,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 (将对象转换为原始值,原始值返回原始值)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值