鍍金池/ 問答/HTML/ jQuery 源碼中的 isPlainObject 函數(shù)疑問點、求指教

jQuery 源碼中的 isPlainObject 函數(shù)疑問點、求指教

代碼:

// 判斷參數(shù)是不是純粹的對象 通過{}、new Object()、Object.create(null)
    isPlainObject: function( obj ) {
        var proto, Ctor;

        // 借用toString方法判斷obj的類型是不是Object
        if ( !obj || toString.call( obj ) !== "[object Object]" ) {
            return false;
        }
        // 獲取對象的原型
        proto = getProto( obj );

        // 通過Object.create( null )創(chuàng)建的對象返回true
        if ( !proto ) {
            return true;
        }

        // 判斷對象是不是通過new Object()方式創(chuàng)建的
        Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
        // fnToString:將函數(shù)轉(zhuǎn)換成字符串 ObjectFunctionString:function Object() { [native code] }
        return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
    }

疑惑:

為什么作者沒有用Object.prototype.toString.call()方法?無論對象是由new Object()、{}、Object()創(chuàng)建的,這個方法的返回結(jié)果都是字符串[object Object],難道這里面還有些別的坑么?
回答
編輯回答
安淺陌

個人理解是,toString.callObject.prototype.toString.call相比,只是寫法更簡便,因為toStringObject.prototype.toString其實指向同一個方法:

clipboard.png

這兩個相等的原因:
如果可以使用toString,那么toString肯定是window對象的方法,window是一個對象;
所有對象如果有原型的話,最終肯定都會指向Object.prototype這個對象;
如果window對象或者除了最后一個原型對象之外的原型對象沒有重新定義toString,那么toString最終指向的就是Object.prototype.toString
經(jīng)過上面截圖認(rèn)證,這兩個確實是一樣的。

2017年1月17日 16:07
編輯回答
大濕胸

請注明jQuery的版本,不同版本實現(xiàn)代碼細(xì)節(jié)上有差異。另外,你貼的代碼是jQuery的源碼,如是,請標(biāo)明。

2017年9月1日 22:46