对象的概念
因为js中没有真正类的概念. js的实例对象都是通过函数的构造函数调用生成的(new), 对象和对象 通过[[prototype]]建立联系.在js里函数本身也是对象.
对象的属性名必须是字符串类型.如果不是字符串类型会自动转为字符串类型. obj.key 和obj[key] 的区别是 obj[key] 可以加入计算属性
- 可枚举性:属性是否可以在for in 中遍历到
- 声明对象的两种方式
Object.defineProperty(对象,属性名称,{
//具体描述
value:'',//初始值
writable:'',//是否可写入,
set(val){ //设置值时可做数据劫持
},
get(){//访问属性时调用.
},
enumerable: //是否可枚举
}
注意set 和get 同时出现,但是不能和 value writable同时出现.
let obj1 = {
name: '李明',
age: 19
}
let obj2 = new Object()
Object.defineProperty(obj2, 'name', {
// value:'德玛西亚',
get: () => {
return this.value
},
set: (val) => {
this.value = val
},
enumerable: true
})
-
常用的方法
- for in 遍历对象本身和对象本身及整条原型链上可枚举类型的属性
let grandParent = {
age: 113
}
let parent = Object.create(grandParent)
parent.name = 'parent'
var son = Object.create(parent)
son.hobby='boxing'
for (let key in son) {
console.log(key)
}
// hobby name age
- Object.keys(obj) 获取对象本身可枚举类型属性数组.
let grandParent = {
age: 113
}
let parent = Object.create(grandParent)
parent.name = 'parent'
var son = Object.create(parent)
son.hobby='boxing'
console.log(Object.keys(son)) //['hobby']
- 判断对象本身是否拥有某个属性obj.hasOwnProperty(key)
- (key in obj) 判断对象本身及整条原型链上是否拥有某个属性.
let obj1 = {
name: '李明',
age: 19
}
console.log(obj1.hasOwnProperty('age')) //true
let grandParent = {
age: 113
}
let parent = Object.create(grandParent)
parent.name = 'parent'
var son = Object.create(parent)
son.hobby='boxing'
console.log('age' in son) //true
- Object.assign(target, ...sources) 将一个或多个对象的可枚举类型属性合并到target对象并返回 一个新的对象
let obj = Object.assign({sex:'男'},obj1,{code:'no.1'});
console.log(obj)//{sex: "男", name: "李明", age: 19, code: "no.1"}
- 5.Object.create(obj)方法创建一个新对象,使用现有的对象来提供新创建的对象的proto。大白话就是创建一个新的空对象,把新对象的____proto__指向obj 将这个新对象返回
let obj ={
name:'abc',
}
let obj2 = Object.create(obj)
console.log(obj2.__proto__ === obj)//true
设置对象属性受哪些因素影响?
- 如果这个属性在对象本身 .且不是只读属性,直接在本对象上修改成功
- 如果这个属性不在对象本身,而在原型链上层或更往上, 且这个属性是可写的.那么直接在对象本身,新增一个同名属性.
3 . 如果这个属性不在对象本身,而在原型链上层或更网上,且这个属性是只读的.那么.直接忽略掉这个设置操作.本身及以上都不会设置这个属性.
let parent = {}
Object.defineProperty(parent,'name',{
value:'parent',
writable:false
})
let son = Object.create(parent)
son.name = 'son'
console.log(son)
// 输出结果可以看到 son 依然是空对象.他的__proto__上的name 依然是parent
let parent = {}
Object.defineProperty(parent,'name',{
value:'parent',
writable:true
})
let son = Object.create(parent)
son.name = 'son'
console.log(son)
// 输出结果可以看到 son{name:'son'}.他的__proto__上的name 依然是parent
比较两个对象
两个对象通过== ===进行比较 .实际上比较的是内存的位置是否一样,而不是像基本类型那样比较值是否相等
let a = {
name:'jack'
}
let b = {
name:'jack'
}
let c = b
console.log(a === b) //false
console.log(a == b) //false
console.log(c == b) //true
网友评论