object 对象 及原型原型链

对象的定义

满足两个条件 :

    1.无序的数据集合

    2.键值对的集合

写法:

let obj = {'name':'frank',’age‘:18}

let obj = new Object({'name':'frank','age':18})

注意细节:

键名是字符串,不是标识符,可以任意字符

键的引号可以省略,省略之后就只能写标识符

——————————重点  就算引号省略了,键名也还是字符串—————

使用Object.keys(obj) 可以得到obj的所有key

变量做属性名

如何用变量做属性名

    let pp = 'name'

    let obj={pp:'frank'}  这样写 属性名为"obj”   这种方法无法得到变量名pp 只能得到字符串"pp"

    let  obj ={[pp]:'frank'}   【pp】这种方法可以得到变量pp  // name:frank


变量做属性名

删除属性

delete obj.name   或者 delete obj['name']

请区分属性值为undefined 和不含属性名

不含属性名(查看是否含有属性名方法:'XXX' in obj === false)

含有属性名,但是值为undefined

"xxx" in obj && obj.xxx ===undefined



查看属性

查看自身所有属性

Object.keys(obj) //查看所有的key

Object.values(obj) //所有的value

Object.entries(obj) //key和value值 以数组形式查看

查看自身+共有属性 

console.dir(obj)  推荐用法

或者自己依次用Object.keys打印出obj.__proto__(不推荐,因为它里面的共有属性比较多)

判断一个属性是自身的还是共有的

obj.hasOwnProperty('toString')


总结:'name' in obj 和obj.hasOwnProperty('name')的区别:前者为查看是否有属性名 后者是判断一个属性是自身属性还是共有属性

修改或者添加属性

修改属性 var obj={name:'frank' ,age:18}  修改属性直接obj.name重新赋值 写法 obj.name = 'lulu'

添加属性 obj.wuwuwu = 'wuwuwu'

批量添加属性 Object.assign(obj,{p1:1,p2:2,p3:3,p4:4})


修改 添加 批量添加属性

修改或者增加共有属性:

比如上面的obj 我们可以通过修改它的obj.__proto__来修改原型  但是这种方法不推荐 一般推荐用另一种 window.Object.prototype 

window.Object.prototype=obj.__proto__   //true


对象的原型图

本图为饥人谷教程图

三个推理公式

推荐阅读更多精彩内容