创建对象及属性修饰

2018-12-18  本文已影响0人  我也不知道啊丶

对象初始化方法:

ES5方法:

生成了一个空对象,具有__proto__属性

字面量方法:


等价于 new Object()

ES6方法:

生成了一个真正的空对象,没有任何属性,生成时必须传入参数

使用ES6的Object.create(Object.prototype)方法,可以生成跟ES5方法一样的具有proto属性的对象

传入Object.prototype参数

对象的缩写:


可以缩写成:
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
这个关系就叫做:ba 的原型
现在a可以访问b上面的所有属性了,但是我们并没有在a上面定义任何属性
ES6规定不要用__proto__方法去访问对象的原型,但是提供了一个方法:
Object.getPrototypeOf(a)
虽然感觉很莫名其妙

undefined是只读的变量

undefined居然不是一个关键字???
undefined的本质是window的一个只读属性
相当于:
因为只有get方法,所以不能更改undefined的值
如果想设置一个只读的属性,可以使用writable:false

两者的区别是:


objname2这个属性,值是undefined
但是obj不是真的有name这个属性,因为每次访问obj.name实际上是在访问obj.get name()这个函数,由这个函数抛出一个name = jack
也可以给name2设置一个默认值:
name2的默认值是aaa

当对象设置了writable:false时,属性是只读的,但是可以通过修改writable:true让其可以修改

writable:true

如果给对象设置一个configurable : false,那么就不能再做出任何更改

设置了configurable : false,如果再修改会直接报错
再修改configurable : true也不行,此时已经不能对objage属性做任何修改

enumerable
当前属性是否需要在遍历的时候展示出来,
当且仅当该属性的enumerabletrue时,才能遍历


可以看到,对象o中是有toString属性的,但是遍历的时候没有打印出来

数组a有length属性,但是遍历的时候同样也没有打印出来

现在来设置一下一下enumerable

给对象a的b属性设置了enumerable:false,所以b属性不会出现在遍历中
相反:
给对象a的b属性设置了enumerable:true,所以b属性会出现在遍历中

使用Obj.getOwnPropertyDescriptor(对象,属性名) // 对象属性描述器来查看a.length

此时给a增加一个属性

name被遍历出来了
使用上面的api来配置一下:
name没有被遍历了,且不能再更改它的值和配置

使用Object.defineProperties()方法,可以一次给对象配置多个属性:

上一篇下一篇

猜你喜欢

热点阅读