# Javascript 对象的操作总结
# 对象创建
创建对象的方法有以下几种
# 字面量方式创建
const obj = {
name:'码不停息',
age:18
}
字面量方式是实际开发中使用最多的创建对象的方式,想比其他方式,优点在于简便、灵活 值得注意的是,_通过字面量创建的对象并没有隐式的调用Object构造函数 并没有通过构造函数创建,但通过instanceof来判断确为Object的实例,是什么原因?
instanceof操作运算原理可以归结为以下方法,虽然在ES2015对instanceof判断的方式做了一些调整,但大体逻辑上还是可以沿用的
// L 表示左表达式,R 表示右表达式
function instance_of(L, R) {
// 取 R 的显示原型
var O = R.prototype;
// 取 L 的隐式原型
L = L.__proto__;
while (true) {
if (L === null)
return false
// 这里重点:当 O 严格等于 L 时,返回 true
if (O === L)
return true
L = L.__proto__
}
}
以上代码可以总结为:通过比较L instanceof R中L原型链中的原型对象是否与R的prototype对象严格相等,来判断L是否为R的实例
因此,虽然字面量形式创建的对象并没有隐式调用Object构造函数,但在创建的时候,o.__proto__ 会默认指向Object.prototype,除非手动修改,否则是成立的
# Object.create()方法创建对象
Object.create()接受两个参数:
Object.create(prototype_object[, properties_object])
- prototype_object: 只能是一个对象或者null,将作为返回的新建对象的原型(即可通过新对象的proto访问),如果传入其他值或不传值,则会报TypeError的错误
- properties_object:可选,与传给
Object.defineProperties()方法的参数一样,通过配置属性的特性来给被创建的对象添加属性,可配置的属性特性是value、writable、enumerable、configurable以及get、set
const prototype_object = {
name: '码不停息',
showColor () {
return this.name
}
}
const properties_object = {
name:{
value:'码不停息'
},
age:{
value:18
}
}
const o = Object.create(prototype_object, properties_object);
console.log(o);
我们可以看到prototype_object在对象的__proto__里面 properties_object的name和age变成了对象的属性
TIP
Object.defineProperties()是一个非常牛逼的API,在原生API章节会着重讲解
# 对象的增删改查
# 增
const obj = {
name:'码不停息'
}
obj.age = 18; //或obj['age'] = 18
console.log(obj) // {name:'码不停息',age:18}
# 删
const obj = {
name:'码不停息',
age:18
}
delete obj.age
console.log(obj) // {name: "码不停息"}
# 改
const obj = {
name:'码不停息'
}
obj.name = '关注公众号码不停息'; //或obj['name'] = '关注公众号码不停息'
# 查
这里我们着重说一说对象的遍历
方法一for in
const obj = {name:'码不停息',age:18};
for(let i in obj){
console.log(i,obj[i]);
}
方法二 Object.keys()
const obj = {name:'码不停息',age:18};
Object.keys(obj).forEatch(item=>{
console.log(item,obj[item])
})