# 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()方法的参数一样,通过配置属性的特性来给被创建的对象添加属性,可配置的属性特性是valuewritableenumerableconfigurable以及getset
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])
})