zoukankan      html  css  js  c++  java
  • js-对象的方法详解

    Object.prototype 上的方法:

    • constructor 

      返回创建该对象的构造函数

      var arr = [];

      arr.constructor == function Array() { [native code] }

      var str = "";

      str .constructor == function String() { [native code] }

     

    • hasOwnProperty

      能判断一个对象是否包含自定义属性而不是原型链上的属性,hasOwnProperty 是 JavaScript 中唯一一个处理属性但是不查找原型链的函数

    Object.prototype.bar = 1 ;
    var foo = {goo: undefined};
    'bar' in foo; // true
    foo.hasOwnProperty('bar'); // false
    foo.hasOwnProperty('goo'); // true

     

    • isPrototypeOf

      isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的原型链中,是则返回true,否则返回false。

    // 这里定义一个正则表达式对象
    var re = /^s*/;
    // 这里检查RegExp是不是re的原形链对象,返回true
    var bIsptt = RegExp.prototype.isPrototypeOf(re);

    • propertyIsEnumerable

        如果 proName 存在于 object 中,且可以使用 For 循环对其进行枚举,则 propertyIsEnumerable 方法返回 true。

        如果 object 不具有所指定名称的属性或者所指定的属性是不可枚举的,则 propertyIsEnumerable 方法将返回 false。

        通常,预定义的属性是不可枚举的,而用户定义的属性始终是可枚举的。

        propertyIsEnumerable 方法不考虑原型链中的对象。

     

     

    Object上的方法:

    • Object.is() (es6)

      比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致 ,不同之处只有两个:一是+0不等于-0,二是NaN等于自身。

    Object.is(+0, -0) // false   
    Object.is(NaN, NaN) // true

    • Object.assign() (es6)

      a:用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)


      b:目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性


      c:只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)


      d:实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用

      e:对于这种嵌套的对象,一旦遇到同名属性,Object.assign的处理方法是替换,而不是添加

    • Object.getOwnPropertyDescriptor

      描述:可以获取该属性的描述对象

    let obj = { foo: 123 };
    Object.getOwnPropertyDescriptor(obj, 'foo')

    返回:
    {
      value: 123,
      writable: true,
      enumerable: true,
      configurable: true
    }

    1.   ES5有三个操作会忽略enumerable为false的属性。
    2.   for...in循环:只遍历对象自身的和继承的可枚举的属性
    3.   Object.keys():返回对象自身的所有可枚举的属性的键名
    4.   JSON.stringify():只串行化对象自身的可枚举的属性
    5.   for...in会返回继承的属性
    6.   ES6新增了一个操作Object.assign(),会忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性。
    7.   ES6规定,所有Class的原型的方法都是不可枚举的。
    • Object.keys(obj) (es6)

        Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)。

    • Object.values()

        Object.values方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值。

    • Object.entries()

        Object.entries方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组。

    • Object.getOwnPropertyNames(obj)

        Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性)。

    • Object.getOwnPropertySymbols(obj)

        Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有Symbol属性。

    • Reflect.ownKeys(obj)

        Reflect.ownKeys返回一个数组,包含对象自身的所有属性,不管是属性名是Symbol或字符串,也不管是否可枚举。
        以上的5种方法遍历对象的属性,都遵守同样的属性遍历的次序规则。
        首先遍历所有属性名为数值的属性,按照数字排序。
        其次遍历所有属性名为字符串的属性,按照生成时间排序。
        最后遍历所有属性名为Symbol值的属性,按照生成时间排序。

    Reflect.ownKeys({ [Symbol()]:0, b:0, 10:0, 2:0, a:0 })
    // ['2', '10', 'b', 'a', Symbol()]

    • Object.setPrototypeOf()

        Object.setPrototypeOf方法的作用与__proto__相同,用来设置一个对象的prototype对象,返回参数对象本身。它是 ES6 正式推荐的设置原型对象的方法。

    let proto = {};
    let obj = { x: 10 };
    Object.setPrototypeOf(obj, proto);
    proto.y = 20;
    proto.z = 40;
    obj.x // 10
    obj.y // 20
    obj.z // 40

    • Object.getPrototypeOf()

        该方法与Object.setPrototypeOf方法配套,用于读取一个对象的原型对象。

    • defineProperty :

        es5可以通过Object.defineProperty()来设置对象自身某个property的属性

    Object.defineProperty(object, propertyname, descriptor)
    #object,待修改的对象
    #propertyname,属性名
    #descriptor,修饰符
    #descriptor要求传入一个对象
    {
      configurable: false, //是否可以删除属性,是否可以修改属性的 writable 、 enumerable 、 configurable 属性。
      enumerable: false, //是否可以枚举,是否可以通过for...in 遍历到,是否可以通过 Object.keys() 方法获取属性名称
      writable: false, //是否可以对属性进行重新赋值
      value: null,     //属性的默认值
      set: undefined, //属性被赋值时,此方法被自动调用
      get: undefined //属性被读取时,此方法被自动调用
    }

      备注;
        Object.defineProperty() 方法设置属性时,属性不能同时声明访问器属性set 和 get和 writable 或者 value 属性。
        意思就是,某个属性设置了writable或者 value 属性,那么这个属性就不能声明 get 和 set 了,反之亦然。

     

  • 相关阅读:
    Fedora 23 配置
    小小的告别一下这个博客
    markdown测试
    ihhh题解
    【BZOJ】1998: [Hnoi2010]Fsk物品调度
    【BZOJ】2563: 阿狸和桃子的游戏
    【BZOJ】3712: [PA2014]Fiolki
    【BZOJ】2333: [SCOI2011]棘手的操作
    我的vimrc
    Ubuntu Gnome 14.04.2 lts 折腾笔记
  • 原文地址:https://www.cnblogs.com/vs1435/p/6554176.html
Copyright © 2011-2022 走看看