• Object静态方法


    静态方法就是直接使用类名调用的方法

    Object静态方法

    1、Object.getPrototypeOf(obj) 获得obj的原型,也可以使用obj._ proto__属性获得obj的原型:

    可以看到对实例变量p使用getPrototypeOf方法可以得到Product.prototype,同时obj一般都是指实例对象,当然对类使用这个方法也可以,但得出的结果没有太大意义。

    1. function fn () {
    2. }
    3. fn.prototype=[10,20]
    4. var obj=new fn()
    5. var re=Object.getPrototypeOf(obj)//==>obj.__prto__
    6. console.log(re) //[10,20]

    2、Object.getOwnPropertyNames(obj) 可以将obj的可枚举和不可枚举的属性的名称组成一个数组返回

    1. var obj=[10,203,4]
    2. var re=Object.getOwnPropertyNames(obj)
    3. console.log(obj,re) // [10, 203, 4]['0', '1', '2', 'length']

    3、Object.key(obj),与getOwnPropertyNames相似,但在数组中使用时没有最后的'length'

    1. var obj={name:'akren',age:20}
    2. var re=Object.keys(obj)
    3. console.log(re) //['name', 'age']
    4. var obj=[10,203,4]
    5. var re=Object.keys(obj)
    6. console.log(obj,re)//[10, 203, 4]  ['0', '1', '2']

    4、Object.values(obj),得到属性值

    5、详细定义对象成员

    1. var obj={}
    2. var temp=null
    3. Object.defineProperty(obj,"age",{
    4. set(arg){
    5. console.log(arg,6666) //set是存值时得到的结果
    6. temp=arg
    7. },
    8. get(){
    9. // return "hello"
    10. return temp+"岁" //取值时得到的结果
    11. }
    12. })
    13. obj.age=100
    14. console.log(obj.age)

    6、工厂函数

    Object.create(proto,[props]) 以proto为原型,新建一个实例对象,同时将props定义的属性设置给这个新对象,以这种方式新建的对象都是Object类型

    1. var o = Object.create(Product.prototype,{
    2. size : {
    3. value : 7,
    4. writable : false,
    5. enumerable : true,
    6. configurable : false
    7. }
    8. });

    使用create方法新建一个实例对象o,它的父类是Product,它本身属于Object,同时设置size为只读属性。注意这种方式不是使用Product的构造函数新建的实例对象,所以o并没有name、desc等属性。

    7、Object.defineProperty(obj,propName,desc) 该方法可以为obj新增一个名为propName的属性,同时它的属性定义为desc,desc使用一个对象赋值

    1. Object.defineProperty(Product.prototype,"a",{
    2. value: "a",
    3. wirtable : true,
    4. enumerable : true,
    5. configurable : true
    6. });

    以上就为Product的prototype新增了一个名为a的属性,设置它的值为a,可写,可枚举,可更改(可更改的意思是否可更改writable、enumerable等),默认都为true。上面的例子为Product.prototype增加了属性a,那么它所有新的实例对象都会增加这个属性。当然obj本身也可以是实例对象。使用这种方式定义一个新属性,可以自主控制属性的表现方式,如果将writable设置为false,这个属性将不可更改,例如:

    将属性a的writable设置为了false,然后更改它的值,虽然没有报错,但是它确实没有被更改,如果在 use strict 模式下,将抛出错误。

    8、 Object.seal(obj) 可以禁止obj对象的属性扩展和删除,它相对与preventExtensible方法而言 ,将所有属性的configurable(结构、可修改)属性设置为false。

    1. var obj={yj:100}
    2. var re=Object.seal(obj)
    3. delete obj.yj
    4. console.log(obj) //{yj: 100}

    9、Object.preventExtensions(obj) 可以禁止obj对象的属性扩展,例如:

    1. var obj={yj:100}
    2. var re=Object.preventExtensions(obj)
    3. console.log(re,re===obj) //{yj: 100} true
    4. obj.age=200
    5. console.log(obj,obj.age) //{yj: 100} undefined

    将实例对象o设置为不可扩展,那么即时给它一个新属性name没有报错,但这个name属性并没有添加到它的定义中。同时size属性的configurable如果设置为true的话,可以使用delete o.size 删除size属性。注意没有preventExtensible的反相操作。

    10、Object.freeze(obj) 可以禁止对obj的所有操作,它相对与preventExtensible方法而言,将属性的configurable属性和writable属性都设置为了false,例如:

    1. var obj={yj:100}
    2. var re=Object.freeze(obj)
    3. // delete obj.yj
    4. obj.yj=300
    5. console.log(obj.yj) //100

    如上,实例对象o将不可扩展,属性不可删除,不可更改。

     Object.isExtensible(obj)、Object.isSealed(obj)、Object.isFrozen(obj) 分别对应了上述三个方法是否对obj进行了设置

    1. var obj = {
    2. yj: 100
    3. }
    4. var re = Object.isExtensible(obj)//Object.freeze(obj)
    5. // delete obj.yj
    6. obj.yj = 300
    7. console.log(obj.yj,Object.isFrozen(obj),Object.isSealed(obj),Object.isExtensible(obj))
    8. //300 false false true

  • 相关阅读:
    【Spring Boot】详解restful api
    Linux下快速搭建YApi接口管理平台
    【探索Linux】—— 强大的命令行工具 P.23(线程池 —— 简单模拟)
    DevSecOps基本概念介绍
    P1059 [NOIP2006 普及组] 明明的随机数
    EMI/EMS/EMC有何异同之处?-唯样商城
    kafka开启SSL认证(包括内置zookeeper开启SSL)
    《数据结构与算法》-栈的概念和栈的实现
    java8 : Collectors.groupingBy(分组)
    聊聊admin服务的架构模式
  • 原文地址:https://blog.csdn.net/m0_63470734/article/details/125606586