suchen

Heim  >  Fragen und Antworten  >  Hauptteil

javascript – Informationen zur Funktion isPlainObject im jQuery-Quellcode, um festzustellen, ob das Objekt ein reines Objekt ist

// 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;

Unten sind die im Einspruchscode genannten Codes aufgeführt

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 );

In jQuery 3.2.1 sind die letzten beiden Zeilen der Funktion, die bestimmt, ob ein Objekt ein reines Objekt ist, nicht gleichwertig, als ich es selbst getestet habe. Ich möchte fragen, wo das Problem liegt

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

Fragen Sie mich

  1. Warum das Ausgabeergebnis

    false

    ist Was bedeutet
  2. Object.hasOwnProperty.call(proto, "constructor") && proto.constructor;

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

phpcn_u1582phpcn_u15822730 Tage vor710

Antworte allen(1)Ich werde antworten

  • 巴扎黑

    巴扎黑2017-06-12 09:30:36

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

    Antwort
    0
  • StornierenAntwort