jQuery 源码中的 isPlainObject 函数疑问点、求指教

代码:

// 判断参数是不是纯粹的对象 通过{}、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 )创建的对象返回true
        if ( !proto ) {
            return true;
        }

        // 判断对象是不是通过new Object()方式创建的
        Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
        // fnToString:将函数转换成字符串 ObjectFunctionString:function Object() { [native code] }
        return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
    }

疑惑:

为什么作者没有用Object.prototype.toString.call()方法?无论对象是由new Object()、{}、Object()创建的,这个方法的返回结果都是字符串[object Object],难道这里面还有些别的坑么?
阅读 2.2k
2 个回答

请注明jQuery的版本,不同版本实现代码细节上有差异。另外,你贴的代码是jQuery的源码,如是,请标明。

个人理解是,toString.callObject.prototype.toString.call相比,只是写法更简便,因为toStringObject.prototype.toString其实指向同一个方法:

clipboard.png

这两个相等的原因:
如果可以使用toString,那么toString肯定是window对象的方法,window是一个对象;
所有对象如果有原型的话,最终肯定都会指向Object.prototype这个对象;
如果window对象或者除了最后一个原型对象之外的原型对象没有重新定义toString,那么toString最终指向的就是Object.prototype.toString
经过上面截图认证,这两个确实是一样的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题