Object

2017-10-24  本文已影响0人  饥人谷_Chou

对象 Object

对象是一些相互关联的数据和功能(通常由若干变量和函数组成,被称为对象的属性和方法)的集合。

{  

属性名:属性值

  方法名:函数

}

声明对象

let ljh={

        name:{zh:'猥琐下',en :'wsx'},

        height:179,

        slzm :['是是是','对对对','说的都对','没错没错'],

}

声明包含属性和方法的数组

let babies=[{ name:{ zh:'周小凌', en:'Hathaway'}, gender:'女'}]    //声明一个对象数组

let 宝贝=[{ 名字:{ 中文:'周小凌', 英文:'Hathaway'}, 性别:'女'}]

let  jay={  name:{ zh:'周杰伦', en:'Jay'},

 height:175,  

children:babies,                                                                    //引用babies 对象数组

songs:['星晴','双节棍','七里香','简单爱','青花瓷','告白气球'],  

company:{ name:'杰威尔音乐有限公司', location:'台北', year:{ founded:2007} },

like() {return'哎哟,不错哦!'},                //   方法

intro:function(lang='zh') {

returnlang==='zh'?`大家好,我是${this.name.zh}。`:`Hi, I'm${this.name.en}.`}

}

const 周杰伦={  名字:{ 中文:'周杰伦', 英文:'Jay'},
身高:175, 
子女:宝贝, 
作品:['星晴','双节棍','七里香','简单爱','青花瓷','告白气球'], 
公司:{ 名字:'杰威尔音乐有限公司', 所在地:'台北', 创办年份:2007}, 
点赞() {return'哎哟,不错哦!'}, 
自我介绍:function(语言='中文') {return语言==='中文'?`大家好,我是${this.名字.中文}。`:`Hi, I'm${this.名字.英文}.`}}

另外声明对象的方法    new Object                     //new是可选的

let  hannah=new Object()

hannah.name={ zh:'昆凌', en:'Hannah'}

hannah.height=165

hannah.children=babies

hannah.catwalk=function() {return '🐈🐈🐈🐈🐈🐈🐈🐈🐈🐈🐈🐈';}

hannah.birth=function(gender,name) { this.children.push({ gender, name });  };


不使用new

const  昆凌=Object({  

名字:{ 中文:'昆凌', 英文:'Hannah'},  

身高:165,  子女:宝贝,  

猫步() {return'🐈🐈🐈🐈🐈🐈🐈🐈🐈🐈🐈🐈'; },  

分娩:function(婴儿性别, 中英文名) {this.子女.push({ 性别:婴儿性别, 名字:中英文名 }) ; },  

自我介绍:function(语言='中文') {return语言==='中文'?`大家好,我是${this.名字.中文}。`:`Hi, I'm${this.名字.英文}.`;} 

})

通过.访问对象属性

>ljh.name.zh
→猥琐下

>ljh.slzm[2]
→说的都对

>jay.like()        //访问 like()方法
→' 哎呦,不错哦'

>hannah.catwalk()                //hannah的catwalk属性函数  catwalk()
→"🐈🐈🐈🐈🐈🐈🐈🐈🐈🐈🐈🐈"

>hannah.children[0].name.zh          //访问hannah的【children() = babies】变量下的数组下标 0 的name的zh数组
→"周小凌"

通过 [ ] 也可以访问对象的属性和方法,当属性名有包含有空格和特殊字符串,或 属性名是变量时,一般使用 [ ] 

>jay['height']

→175>

jay['company']['location']    //周杰伦['公司']['所在地']

→"台北">

jay['intro']()         //周杰伦['自我介绍']()

→"大家好,我是周杰伦。"

>阿星['如 来 神 掌']

→"🖐🖐🖐🖐🖐"

>['name','height'].map(function(property) {returnjay[property] })

→ [{ zh:'周杰伦', en:'Jay'},175]

>jay[prompt('查看 jay 的哪个属性?','songs')]→

>周杰伦[prompt('周杰伦的(?)是1979年1月18日。')]='1979年1月18日'

→"1979年1月18日"

语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·蘭丁发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。语法糖让程序更加简洁,有更高的可读性。 举例来说,许多程序语言提供专门的语法来对数组中的元素进行引用和更新。

let {name,songs,height }= jay

Object.keys()

通过用Object.keys()ES5 方法 可以获取对象的的所有属性名。

Object.keys(jay)

["name","height","children","songs","company","like","intro"]

修改对象

jay.age = 38                //创建并且赋值,  jay的age = 38

jay.age -= 10              //jay 减去 10  age = 20

hannah.husband=jay

→ {name:Object, height:175, children:Array(1), songs:Array(6), company:Object}

hannah.husband是对 jay 数组的引用(Reference),因此以下代码会直接修改jay。

>hannah.jay.name.zh='小周周'

"小周周"

jay.name.zh

"小周周"

delete     delete

delete可用于删除对象的属性或方法

>delete   jay.songs            //delete 周杰伦.作品

→true

>jay.songs//周杰伦.作品

→undefined

>delete    hannah.catwalk             //delete 昆凌.猫步

→true

>hannah.catwalk    //     昆凌.猫步

→undefined

delete操作总是返回true,无论属性或方法是否存在

this

this指当前对象,因此jay.intro()里面的this就是jay,hannah.intro()里面的this就是hannah。

this是当前对象,因此jay,intro()里面的this就是jay,hannah.intro()里面的this就是hannah。

>jay.intro()//周杰伦.自我介绍()

→ 大家好,我是周杰伦。

>hannah.intro()//昆凌.自我介绍()

→ 大家好,我是昆凌。

in

in用于检查对象是否具有某个属性或者方法。

>'wife' in jay

→true>

'妻子' in jay

→false>

'妻子' in 周杰伦

→true

以上代码中的引号不能省略,如果省略 JavaScript 会认为那是一个变量。

>let wife = '妻子'

→undefined

>wife in jay

→false

> wife in 周杰伦

→true

遍历对象

for...in 用于遍历对象的属性和方法,      //for...in 也可以用来遍历数组,但是并不推荐。

for(let key in jay ){
 console.log( key , jay[key]);
}

for( let 属性 in 周杰伦){
 console.log(属性 , 周杰伦[属性])
}

结合 for...in   in 和 this  实现  周杰伦,.专辑.播放()方法

周杰伦.专辑.播放 =function(专辑或者单曲) {
let 专辑名称= 专辑或者单曲;
if(专辑名称 in this ){
return `播放专辑 ${专辑名称} ,—发行年份${this[专辑名称].发行年份}`;}

let 单曲名称 = 专辑或者单曲
for( let 专辑名 in this ){
let 专辑曲目 = this[专辑名]['专辑曲目'];
if (Array.isArray(专辑曲目)&&专辑曲目.indexOf(单曲名称) > -1 ){
return `播放单曲 ${单曲名称} ,—来自专辑${专辑名}`}
}

return `对不起,没有收录这张专辑或这首单曲。`

}

英文对象
周杰伦.专辑.play = function (aors){
let album= aors;
if( album in this ){
return ` 播放专辑${album} —发行年份${this[album].发行年份}。`}

let song = aors  ; 
for( let al in this ){
let songs = this[al]['专辑曲目'];
if( Array.isArray(songs) && songs.indexOf(song)  > -1 ){
return ` 播放单曲 ${song} — 来自专辑 ${al} `}
}
return `对不起,没有收录这张专辑或这首单曲。`

}

引用类型

对象(还有数组,函数等)属于引用类型,因此,jay.childrenhannah.childrenbabies都是引用着同一个数组。

hannah.children.push({ name:{ zh:'周小伦', en:'Jason'}, gender:'男'})//hannah 生二胎
→2
>jay.children
→ [{ name:{ zh:'小周周', en:'Hathaway'}, gender:'女'} 
     { name:{ zh:'周小伦', en:'Jason'}, gender:'男'}]

当==或===作用于对象的时候,实际是在问:这两个变量引用的是用一个对象吗?

>jay.children===hannah.children//周杰伦.子女 === 昆凌.子女
→true
>jay.children===babies
→true
>hannah.children===babies
→true
>empty===空对象
→false
>{ name:'韩梅梅'}==={ name:'韩梅梅'}
→false

s

上一篇下一篇

猜你喜欢

热点阅读