JS 对象基本用法

101 阅读2分钟

1. 声明对象的两种语法

let obj = {'name': 'xxx', 'age': 25 }   //简单写法
let obj = new Object ({'name': 'xxx', 'age': 25 })   //标准写法

注意:

  1. 键名是字符串,不是标识符,可以包含任意字符
  2. 引号可省略,省略之后就只能写标识符
  3. 就算引号省略了,键名也还是字符串!!!

2.属性的增删查改

1. 如何删除对象的属性

 delete obj.xxx 或 delete obj['xxx']

检测一个对象是否含有属性名:

'xxx' in obj === false   //不含属性名
'xxx' in obj && obj.xxx === undefined   //含有属性名,但是其值为undefined

注意: obj.xxx === undefined不能断定'xxx'是否为obj的属性可能有两种情况:

  1. 不含属性名;
  2. 含有属性名,其值为undefined

2. 如何查看对象的属性

查看某一个属性:

obj['key']   //中括号语法
obj.key   //点语法,点语法会误导你,让你以为key不是字符串,等确定不能弄混两种语法再改用点语法
obj[key]   //查看某一个属性:坑新人语法,因为变量key值一般不为'key'

查看自身所有属性:

Object.keys(obj)

查看自身+共有属性:

console.dir(obj)
依次用Object.keys打印出obj.__proto__

判断某个属性为自身的还是共有的:

obj.hasOwnProperty('xxx')

3. 如何修改或增加对象的属性

注意: 增改放一起是因为大部分用法基本一样:已有属性则改;没有属性则增。

直接赋值:

let obj = {name: 'xxx' }   //name是字符串
obj.name = 'xxx'   //name是字符串
obj['name'] = 'xxx'
obj[name] = 'xxx'   //错,因为name值不确定
obj['na'+'me'] = 'xxx'
let key = 'name'; obj[key] = 'xxx' 
let key = 'name'; obj.key = 'xxx'   //错,因为obj.key等价于obj['key']

批量赋值:

Object.assign(obj, {name: 'xxx', age :18 })

修改或增加共有属性:

注意: 一般来说不推荐修改原型,会引起很多问题

obj.__proto__.toString = 'xxx'   //强烈不推荐用__proto__
Object.prototype.toString = 'xxx' 

注意: 无法通过自身来修改或增加共有属性

let obj ={}, obj2= {}   //共有属性toString
obj.toString = 'xxx'   //只会修改obj自身属性,obj2.toString还是在原型上

修改隐藏属性:

let obj = {name: 'aaa'}
let obj2 = {name: 'bbb'}
let common = {kind:'human'}
obj.__proto__ = common
obj2.__proto__ = common
let obj = Object.create(common)
obj.name = 'aaa'
let obj2 = Object.create(common)
obj2.name = 'bbb'

注意: 不推荐使用__proto__,推荐使用Object.create。需要改建议开始改,别后来再改。

3. 'name' in obj和obj.hasOwnProperty('name') 的区别

  • 'name' in obj是判断obj对象里是否含有name属性名的属性。
  • obj.hasOwnProperty('name')是判断一个属性是自身的还是共有的。