美文网首页程序员让前端飞
Object的一些静态方法(3)

Object的一些静态方法(3)

作者: lanzhiheng | 来源:发表于2016-10-26 09:57 被阅读67次

    0. 开场白

    我个人博客现在还没正式上线,不过从简书的点击率来看,之前的文章每篇大概有100来个人会点击进来,其实这种点击我已经是比较心满意足了(如果你经历过每篇文章只有不到10个人点击的日子,或许也会理解我现在的心理状态)。

    今天继续写每天学点javascript。其实这个系列文章用这样的标题主要是为了吸引眼球,并不是说我一定每天都会发一篇这类文章。毕竟有时候事情多,如果太过强迫自己每天来连载的话在某种程度上肯定会降低了文章的质量,这是不可取的,我只能保证会坚持连载,并且尽可能多写,但不能保证每天。当文章累积到足够的数量的时候,或许就能够让读者有一种每天学点的感觉吧。

    今天还是讲述两个方法:

    Object.getPrototypeOf获取传入参数的原型

    Object.toString, Object.prototype.toString定义对象的字符串表示

    内容比较简单,大牛们可以选择跳过,或者留言吐槽。

    1. 正文

    Object.getPrototypeOf获取传入参数的原型

    通过这个方法,以对象作为参数传入,则可以返回这个对象的原型,使用方式比较简单,犀牛书第三部分也有提供例子,我对例子稍做修改

    > var strObject = new String("lanzhiheng") // 创建字符串对象,原型是String.prototype
    undefined
    
    > Object.getPrototypeOf(strObject) // 获取新创建对象的原型
    [String: '']
    

    我擦,这肯定看不出什么是吧,就算我这样做

    > String.prototype
    [String: '']
    

    似乎也只能说明,String.prototype碰巧换算出来是[String: ''],谁能保证它就是创建strObject的原型?

    我们还记得用==比较两个指向对象的变量,只有当它们都指向同一个对象的时候才相等吗?

    > {} == {} // 两个不同的对象
    false
    
    > var a = b = {}
    undefined
    
    > a == b // a和b指向同一个对象
    true
    

    用同样的原理我们可以这样判断

    > Object.getPrototypeOf(strObject) == String.prototype
    true
    

    哈哈,这样就可以判断出,strObject的原型其实就是String.prototype。更进一步

    > var obj = {};
    undefined
    
    > var nextObj = Object.create(obj) // 以obj为原型创建一个新的对象
    undefined
    
    > Object.getPrototypeOf(nextObj) == obj // 它的原型就是obj
    true
    

    这样应该了解这个方法的作用了吧?

    Object.toString, Object.prototype.toString定义对象的字符串表示

    几乎是每一个类型都有它自己的toString类方法,当然null这种肯定就没有了。另外,几乎所有对象也有它们对应类型的toString方法,这个是从原型链继承来的,也就是Object.prototype.toString。这个原型的Object.prototype.toString方法跟Object.toString是不一样的。前者是可以通过原型链条传承下去,而后者只是Object这个类型的一个类方法而已。

    > Object.toString == Object.prototype.toString // 它们是不一样的
    false
    
    > var b = Object.create(Object.prototype)
    undefined
    
    > b.toString == Object.prototype.toString // 通过原型链继承下去了
    true
    

    可见,对象的属性没有进行任何重载的情况下调用的依然是原型链中的Object.prototype.toString方法。

    当然,我们很少会主动去调用,一般它们会在需要的时候自动调用, 你看:

    > Object.prototype.toString()
    '[object Object]'
    > var a = 1
    undefined
    > a + Object.prototype
    '1[object Object]'
    

    后面的Object.prototype自动调用了toString,然后才进行了字符串的拼接操作(当然变量a也进行了类似的转换)。

    除此之外,Object.prototype.toString作为最为原始的toString`版本可以用来判断对象属于什么类型。

    > function classOf(p) { // 定义这个样一个方法
    ...     if (p === null) return 'null';
    ...     if (p === undefined) return undefined;
    ...     return Object.prototype.toString.call(p).slice(8, -1);
    ... }
    undefined
    
    > classOf(1)
    'Number'
    > classOf(null)
    'null'
    

    为什么要调用原始版本?每个不同的类型的原型上不是都有toString吗?

    正是因为每种不同类型的原型都可能有它们自己定制的toString。我们需要的才必须是Object.prototype.toString这个方法,如:

    > (new Date()).toString()
    'Wed Oct 26 2016 09:00:31 GMT+0800 (CST)'
    > (new Number()).toString()
    '0'
    > (new Object()).toString()
    '[object Object]'
    

    只有Object.prototype.toString会返回类似[object Number]的结果,我们只需要拿最后的Number便可。

    但是这个东西并不能是总能判断出一个对象的所属类,如果它不是内置类型的话,我们就不能这样干了。

    > function Range(x) {this.x = x} // 创建一个类
    undefined
    > var r = new Range() // 创建这个类的对象
    > classOf(new Range())
    'Object'
    

    可见,得出的类型只是Object。我们没办法通过这种方式得出结果Range。这个在使用的时候还是要多加注意。

    2. 最后

    这两个方法还是比较容易理解的,原谅我不小心就说了那么多。很感谢你能看到最后。

    Happy Writing & Coding

    相关文章

      网友评论

        本文标题:Object的一些静态方法(3)

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