美文网首页
创建对象及属性修饰

创建对象及属性修饰

作者: 我也不知道啊丶 | 来源:发表于2018-12-18 17:45 被阅读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()方法,可以一次给对象配置多个属性:

    相关文章

      网友评论

          本文标题:创建对象及属性修饰

          本文链接:https://www.haomeiwen.com/subject/jmpkkqtx.html