美文网首页
JS标准库系列(一)—— Object对象

JS标准库系列(一)—— Object对象

作者: 周花花啊 | 来源:发表于2017-02-11 08:55 被阅读0次

    一、概述


    JS原生提供一个Object对象,所有其他对象都继承自这个对象。

    1.1、首先Object是一个构造函数,自然也属于对象类型(广义的),它上面有各种属性和方法。

    用这个构造函数可以构造出所有的对象(广义的),如下:

    var o1 = {a: 1};
    var o2 = new Object(o1);
    o1 === o2 
    // true
    
    new Object(123) instanceof Number
    // true
    

    Object作为构造函数使用时,可以接受一个参数。如果该参数是一个对象,则直接返回这个对象;如果是一个原始类型的值,则返回该值对应的包装对象。

    JS中规定所有的对象都是Object的一个实例

    上面也反映了JS中一切都源自于对象这个概念。
    也正是因为此,这个系列的开篇一定是介绍Object对象。

    1.2、我们还可以在Object上写方法,有两种方式:
    • 部署在Object对象本身:
    Object.printName = function(){....}
    //这样就可以调用
    Object.printName();
    
    • 部署在Object.prototype对象:
      所有构造函数都有一个prototype属性,指向一个原型对象。
      凡是部署在Object.prototype对象上的方法都会被所有的实例对象共享。
    Object.prototype.printName = function(){....}
    var obj1 = new Object();
    //这样就可以调用
    obj1.printName();  //obj1这个实例对象继承了Object.prototype对象上的方法
    

    上面代码在Object.prototype定义一个printName方法,然后生成一个Object的实例obj1obj1直接继承了Object.prototype的属性和方法,可以在自身调用它们,也就是说,obj1对象的printName方法实质上是调用Object.prototype.printName方法。

    这里我们可以看到两者的printName方法功能相同,但是写法却不一样,所以必须区分构造函数的方法和实例对象的方法。

    二、Object()


    Object()本身是一个函数,可以作为工具方法使用。它可以让任意值转换为对象,这个方法常用于保证某个值一定是对象。

    • 如果参数是原始值,Object()返回对应的包装对象的实例:
    Object() // 返回一个空对象
    Object() instanceof Object // true
    
    Object(undefined) // 返回一个空对象
    Object(undefined) instanceof Object // true
    
    Object(null) // 返回一个空对象
    Object(null) instanceof Object // true
    
    Object(1) // 等同于 new Number(1)
    Object(1) instanceof Object // true
    Object(1) instanceof Number // true
    
    Object('foo') // 等同于 new String('foo')
    Object('foo') instanceof Object // true
    Object('foo') instanceof String // true
    
    Object(true) // 等同于 new Boolean(true)
    Object(true) instanceof Object // true
    Object(true) instanceof Boolean // true
    
    参数是原始值时返回对应包装类型实例

    上面的代码表示了,用该方法可以将各种值转化为对应的构造函数生成的对象,这种方法并不直观,所以不常用。

    • 如果参数是对象的话,那么它总是返回原对象:
    参数是对象那就返回原对象

    由上面两种异同我们可以写一个函数,来判断一个值是不是对象:

    function isObject(value){
        return value === Object(value);
    }
    //判断参数值是不是对象,如果是则会返回true
    isObject([]);
    isObject(1);
    
    验证

    三、Object对象的静态方法


    所谓静态方法,就是指部署在Object对象自身的方法,也就是该构造函数的方法,并不是实例的方法。
    该对象的静态方法有很多,这里只介绍目前比较常用的几种。

    3.1、Object.keys()、Object.getOwnPropertyNames()

    用来遍历对象的属性名,参数是要遍历的那个对象,都返回一个数组,数组成员是对象自身的(非继承)所有属性名,区别在于:

    Object.keys():只返回可枚举的属性名。
    Object.getOwnPropertyNames():还返回不可枚举的属性名。
    
    • 对一般的对象这两种方法无差别:
    对一般对象无差别
    • 涉及到不可枚举属性时才会有差别:
    涉及到不可枚举属性差别

    所以我们可以使用这两个方法来计算对象属性的个数:

    Object.keys(o).length;
    Object.getOwnPropertyNames(o).length;
    

    一般情况下,几乎总是使用Object.keys方法遍历数组的属性。

    3.2、原型链相关方法:
    - Object.create():生成一个新对象,参数是新对象的原型。
    - Object.getPrototypeOf():获取对象的Prototype对象。
    - Object.setPrototypeOf():设置现有对象的原型,返回新对象。
    

    还有一些几乎没用过的方法,这里不再赘述。

    四、Object对象实例的方法


    除了Object对象自身的方法,还有很多定义在Object.prototype对象上的方法,所有Object对象实例对象都会共享这些方法。

    Object实例对象
    由上图可以看出Object实例对象的常用方法有以下6个:
    - valueOf(): 返回当前对象对应的值。
    - toString(): 返回当前对象对应的字符串形式。
    - toLocaleString(): 返回当前对象对应的本地字符串形式。
    - hasOwnproperty(): 判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。
    - isPrototypeOf(): 判断当前对象是否为另一个对象的原型。
    - propertyIsEnumerable(): 判断某个属性是否可枚举。
    

    这里只讲前面两个。

    4.1、Object.prototype.valueOf()

    valueOf方法的作用是返回一个对象的”值“,默认情况下返回对象本身

    默认返回本身
    var obj1 = new Object();
    obj1.valueOf() === obj1;
    // true
    

    valueOf的主要用途是,JS自动类型转换时会先调用这个方法,接着调用tiString方法:

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

    所以如果你异想天开想得到不一样的值那你就可以自己改写一下valueOf这个方法:

    var obj1 = new Object();
    obj1.valueOf = function(){
        return 2;
    };
    1+obj1;
    // 3
    

    上面的代码在实例对象自身上定义了静态的valueOf方法,相当于覆盖了构造函数共享给它的valueOf方法。即用obj1.valueOf覆盖了Object.prototype.valueOf

    4.2、Object.prototype.toString()

    toString方法的作用是返回一个对象的字符串形式,默认情况下返回类型字符串

    var o1 = new Object();
    o1.toString();  // "[object Object]"
    var o2 = {a:1};
    o2.toString();  // "[object Object]"
    

    可以看到,对一个对象调用toString方法,会返回字符串[object Object],该字符串说明对象的类型

    同样,你也可以异想天开的自己定义toString方法:

    var o = new Object();
    o.toString = function(){
        return 'Hello';
    };
    o + ' ' + 'world' // "hello world"
    

    由于数字、字符串、数组、函数对象都改写了这个方法,所以你会看到它们的不同:

    默认返回字符串形式

    这样我们发现Object.prototype.toString被实例对象上的toString方法覆盖了,导致我们没办法看出它们的数据类型。

    4.2、toString()的应用:判断数据类型

    Object.prototype.toString方法返回一个对象的类型字符串,因此可以用来判断一个值的类型。

    var o = {};
    o.toString()  //"[object Object]"
    

    返回的字符串中第二个Object表示该值的构造函数,这是一个非常有用的判断数据类型的方法。

    而由于实例对象上自定义了toString方法,这样就覆盖了Object.prototype.toString方法,达不到判断数据类型的效果,这里我们就要用到函数的call方法了,因为它可以指定在任意值上调用Object.prototype.toString方法,帮助我们判断这个值得类型。

    也就是说Object.prototype.toString可以得到一个实例对象的构造函数。

    (本系列下一节为 — Array对象)

    相关文章

      网友评论

          本文标题:JS标准库系列(一)—— Object对象

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