声明对象的语法
对象是以键值对(key: value)的形式存储的,需要注意的是 key 的类型是 string
let obj = {'width': 100, 'height': 200}
let obj = new Object({'width': 100, 'height': 200})
原型
每个对象都有原型
原型用来存对象的共有属性
obj.__proto__ 存着原型的地址
原型里有 toString / valueOf 等属性
对象的原型也是对象
对象的原型也有原型,这个原型是 null,即为对象的根
删除对象属性
delete obj.xxx
delete obj['xxx']
判断不含属性名
'xxx' in obj === false
判断含有属性名,但是值为 undefined
'xxx' in obj && obj.xxx === undefined
注意
obj.xxx === undefined
// 不能断定'xxx'是否为 obj 的属性
let x = {}
x.a === undefined
// true
// 无论有没有此属性,都会返回 true
查看对象属性
查看自身所有属性
Object.key(obj)
查看自身 + 共有属性
console.dir(obj)
判断属性是否存在
判断是否为自身属性
obj.hasOwnProperty('toString')
判断是否为共有属性
var obj = {
p: 123
};
if("toString" in obj){
if("obj".hasOwnProperty("toString")){
console.log("属性为私有属性")
}else{
console.log("属性为共有属性")
}
}else{
console.log("不存在该属性")
}
// 属性为共有属性
查看属性
- 中括号语法 obj['key'] // key 为字符串
- obj[key] // key 为变量
- 点语法 obj.key
推荐使用中括号语法,key的值是字符串类型,点语法会产生误导
修改或增加对象属性
直接复制
let obj = {name: 'murphy'} // name 是字符串
obj.name = 'murphy' // name 是字符串
obj['name'] = 'murphy'
let key = 'name'; obj[key] = 'murphy'
批量赋值
Object.assign(obj, {name: 'murphy', age: 18, gender: 'man'})
修改隐藏属性
__proto__
不推荐使用,过时不符合规范
let obj = {name: 'murphy'}
let common = {hobby: 'read'}
obj.__proto__ = common
Object.create
推荐使用
let common = {hobby: 'read'}
let obj = Object.create(common)
obj.name = ”murphy"
let obj2 = Object.create(common)
obj2.name = ”jack"
建议一开始就修改原型,后面改会影响性能
推荐使用 Obejct.create
一开始就把原型指定好,后面再改很影响性能