javascript - 关于 jQuery 源码中的 isPlainObject 函数判定对象是否为纯对象的问题

查看:51
本文介绍了javascript - 关于 jQuery 源码中的 isPlainObject 函数判定对象是否为纯对象的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

// Objects with prototype are plain iff they were constructed by a global Object function
Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; //这行是什么意思?
return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;

以下是上诉代码中提到的代码

var class2type = {};
var toString = class2type.toString;
var getProto = Object.getPrototypeOf;
var hasOwn = class2type.hasOwnProperty;
var fnToString = hasOwn.toString; 
var ObjectFunctionString = fnToString.call( Object );
var proto, Ctor;
proto = getProto( obj );

jQuery 3.2.1 中,判定对象是否为纯对象的函数,最后两行,我自己测试的时候是不对等的,想问下问题在哪里

var obj = function(){};
var proto = Object.getPrototypeOf(obj);
var Ctor = Object.hasOwnProperty.call(proto, "constructor") && proto.constructor;
var objHasOwn = Object.hasOwnProperty.toString.call( Object );
var funcHasOwn = Object.hasOwnProperty.toString.call( Ctor );

console.log(funcHasOwn === objHasOwn); // 我使用纯 function 来测试,发现结果是 false

问下

  1. 为什么输出结果是 false

  2. Object.hasOwnProperty.call(proto, "constructor") && proto.constructor; 是什么意思

  3. Object.hasOwnProperty.toString.call( Object ) 输出为function Object() { [native code] }
    Object.hasOwnProperty.toString.call( Number )输出为function Number() { [native code] } 是为什么

解决方案

    // 判断参数是不是纯粹的对象 通过{}、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;
    }

1、var obj = function(){};返回false是因为你对这个函数功能理解错了,它不是说通过函数创建,它的意思是new Object();

Object.hasOwnProperty.toString.call( Number )输出为function Number() { [native code] }是因为Object.hasOwnProperty.toString会以字符串方式返回该对象的构造器函数,call方法借用Object.hasOwnProperty上的toString方法。

这篇关于javascript - 关于 jQuery 源码中的 isPlainObject 函数判定对象是否为纯对象的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆