Object作为函数和对象对应的方法及属性集合

308 阅读4分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

前言

Object作为函数和对象,有不同的方法和属性,很容易搞混,这次做个总结,先总结一下作为函数时的方法和属性,再总结作为对象时(自身的和原型上的)属性。

Object作为函数

  • Object(value): 将任意值转换为对象
    var obj = Object(); // {}
    var obj = Object(111); // Number {111}  
    // 等同于
    var obj = Object(undefined); // {}
    var obj = Object(null); // {}
    
    如果参数value是一个基础数据类型,则转换为对应的包装对象
    var obj = Object(1);
    obj instanceof Object // true
    obj instanceof Number // true
    

    注意:instanceof运算符用来验证,一个对象是否为指定的构造函数的实例。obj instanceof Object返回true,就表示obj对象是Object的实例。 如果参数value是一个引用数据类型,对象或者数组或者函数,则不用转换。 利用这一点,可以写一个判断变量是否为对象的函数。

        // 判断一个数是否是对象
        function isObject(value) {
            // 如果value是基本数据类型,则转换为对应的包装对象
            // 如果是对象,则什么都不干
            return value === Object(value)
        }
        console.log(isObject(111)) // false
        console.log(isObject([])) // true        
    

Object作为构造函数

前面可以加new命令来生成一个对象,但是这种生成对象有点麻烦,现在是用var obj = {}来快速生成一个对象。(两种方法生成对象是等价的,只是后面的写法更简洁)

注意:new Object(value)和上述的Object(value)方法用法是一模一样,但是性质不一样,前者返回一个新的对象,后者是将value转成一个对象,在内存中都会开辟一块存储空间来存这个对象。

Object自身的方法

  • Object.keys(obj)

    参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是继承的)所有属性名。

    var obj = {
      p1: 123,
      p2: 456
    };
    Object.keys(obj) // ["p1", "p2"]
    
  • Object.getOwnPropertyNames()

    该方法和Object.keys(obj)看似一样,但是有一个不同的地方是,Object.getOwnPropertyNames()可以返回枚举属性和不可枚举属性,而Object.keys(obj)只返回可枚举属性。

    var a = ['Hello', 'World'];
    Object.keys(a) // ["0", "1"]
    Object.getOwnPropertyNames(a) // ["0", "1", "length"]
    

    数组的length属性是不可枚举的属性,所以只出现在Object.getOwnPropertyNames方法的返回结果中。

    在一般情况下,Object.keys(obj)用的比较多。

  • 属性描述对象:Object.getOwnPropertyDescriptor(对象,属性)

    获取某个属性的描述对象。这个属性的描述对象里面,包含了4个属性。查看该属性能否改写,能否枚举。当然可以修改描述对象。

        const obj = {
            aaa: 111
        }
        console.log(Object.getOwnPropertyDescriptor(obj, 'aaa')) 
        // {
        //     configurable: true,
        //     enumerable: true,
        //     value: 111,
        //     writable: true
        // }
    
  • 修改某个属性对应的描述对象Object.defineProperty(对象,属性,更改的配置)

    Object.defineProperty(obj, 'aaa', {
            writable: false // 不可改写
    })
    obj.aaa = 222
    // 在非严格模式下不会报错,在严格模式下会报错。
    console.log(obj)// {aaa: 111}
    

    这两个方法是获取对象属性,主要是查看当前属性能否改写,或者控制某些属性,不能改写。

  • 控制对象状态的方法Object.freeze():冻结一个对象。`

  • Object.isFrozen():判断一个对象是否被冻结。

  • 原型链相关方法

    1. Object.create():这个是以指定的对象为原型来创建一个新的对象。
        const person = {
             isHuman: false,
             printIntroduction: function () {
                 console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
             }
         };
         let newobj = Object.create(person)
         console.log(person === newobj.__proto__) // true
         console.log(newobj.__proto__) 
         // {
         // isHuman: false,
         //     printIntroduction: function () {
         //         console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
         //     }
         // };
    

Object实例方法

实例方法主要有6个,定义在Object.prototype上,所有的实例都可以用这个方法。

  • Object.prototype.valueOf()

    返回对象的值,obj === obj.valueOf()true

    主要用途是在数据类型转换中可以使用。

    var obj = new Object();
    1 + obj // "1[object Object]"
    

    上述代码会先调用valueOf()拿到对象的值(也就是该对象本身),再调用toString()转换成基础类型。toString()后面会说。所以,我们可以自己更改这个实例的方法,来覆盖掉原型上的方法。

    var obj = new Object();
    obj.valueOf = function () {
      return 2;
    };
    // 更改这个实例的方法,来覆盖掉原型上的方法。
    1 + obj // 3
    
  • Object.prototype.toString()

    返回一个对象的字符串格式,一般是"object object",但是返回这个意义不大,可以和上述提到的valueOf()方法一样,自己改写,然后覆盖掉原型上的方法。

    var obj = new Object();
    obj.toString = function () {
      return 2;
    };
    // 更改这个实例的方法,来覆盖掉原型上的方法。
    1 + obj // 3
    

数组、字符串、函数、Date 对象都分别部署了自定义的toString方法,覆盖了Object.prototype.toString方法。

扩展:Object.prototype.toString.call(value)方法返回这个value具体的数据类型。这个.call()等我查一下,搞清楚了再来更新。

  • Object.prototype.hasOwnProperty(属性) 用来判断该属性是否是自身的属性,不是继承自原型的属性,是自身的属性,返回true,继承自原型上的,就返回false

    var obj = {
      p: 123
    };
    
    obj.hasOwnProperty('p') // true
    obj.hasOwnProperty('toString') // false
    

    在项目中具体哪里使用还没用到,等用到了再来补充吧。