对象初始化方法:
ES5方法:
字面量方法:
等价于 new Object()
ES6方法:
使用ES6的Object.create(Object.prototype)
方法,可以生成跟ES5方法一样的具有proto属性的对象
对象的缩写:
可以缩写成:
key和val相同可以简写
对象中使用变量(动态属性名):
ES5方法:
ES6方法:
初始化对象时直接使用 [ 变量 ] 把变量放在里面
方法定义
读取
obj.age
时相当于访问了get age()
,设置
obj.age
时相当于访问了set age()
利用这个方法,可以解一道经典的算法题
a === 1 && a === 2 && a === 3 // true
Object.defineProperty(obj, prop, descriptor)
方法(属性修饰),obj
要在其上定义属性的对象,prop
要定义或修改属性的名称,descriptor
将被定义或修改的属性描述符MDN详细资料
计算属性名
属性名可以有复杂的计算拓展属性
复制对象上的属性,如果直接用一个对象等于另外一个对象,实际上只是共用了一个对象属性的地址,两个对象完全相等,改变其中一个对象属性的值,另外一个对象也会跟着改变:
想要实现两个对象不相等且互不影响,可以用for in
循环的方法:
当然,有简单一点的方法:
Object.assign()
Object.assign()相当于for in 循环了
奇怪的ES6还提供了一个更简洁的方法:
... 相当于全部拷贝
所以ES6可以有让人眼花缭乱的对象创建方法:
变更原型
我们知道,每个对象都有一个__proto__
的值,但是ES6规定不要自己去访问
实际上
a.__proto___ === Object.prototype
如果我们想改变一下
a
的隐藏属性,可以可以看到,此时 a的__proto__已经等于b
这个关系就叫做:
b
是 a
的原型现在
a
可以访问b
上面的所有属性了,但是我们并没有在a
上面定义任何属性ES6规定不要用
__proto__
方法去访问对象的原型,但是提供了一个方法:Object.getPrototypeOf(a)
虽然感觉很莫名其妙
undefined
是只读的变量
undefined
的本质是window
的一个只读属性相当于:
因为只有get方法,所以不能更改undefined的值
如果想设置一个只读的属性,可以使用
writable:false
:两者的区别是:
obj
有name2
这个属性,值是undefined
,但是
obj
不是真的有name
这个属性,因为每次访问obj.name
实际上是在访问obj.get name()
这个函数,由这个函数抛出一个name = jack
也可以给
name2
设置一个默认值:name2的默认值是aaa
当对象设置了writable:false
时,属性是只读的,但是可以通过修改writable:true
让其可以修改
如果给对象设置一个configurable : false
,那么就不能再做出任何更改
再修改
configurable : true
也不行,此时已经不能对obj
的age
属性做任何修改enumerable
当前属性是否需要在遍历的时候展示出来,
当且仅当该属性的enumerable
为true
时,才能遍历
可以看到,对象
o
中是有toString
属性的,但是遍历的时候没有打印出来数组a有
length
属性,但是遍历的时候同样也没有打印出来
现在来设置一下一下enumerable
:
相反:
给对象a的b属性设置了enumerable:true,所以b属性会出现在遍历中
使用Obj.getOwnPropertyDescriptor(对象,属性名) // 对象属性描述器
来查看a.length
此时给a
增加一个属性
使用上面的api来配置一下:
name没有被遍历了,且不能再更改它的值和配置
使用Object.defineProperties()
方法,可以一次给对象配置多个属性:
网友评论