cari

Rumah  >  Soal Jawab  >  teks badan

javascript - Mengenai fungsi isPlainObject dalam kod sumber jQuery untuk menentukan sama ada objek itu objek tulen

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

Di bawah adalah kod yang dinyatakan dalam kod rayuan

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

Dalam jQuery 3.2.1, dua baris terakhir fungsi yang menentukan sama ada objek adalah objek tulen tidak setara apabila saya mengujinya sendiri, saya ingin bertanya apa masalahnya

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

Tanya saya

  1. Kenapa hasil keluaran adalah false

  2. Apakah maksud
  3. Object.hasOwnProperty.call(proto, "constructor") && proto.constructor;

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

phpcn_u1582phpcn_u15822730 hari yang lalu709

membalas semua(1)saya akan balas

  • 巴扎黑

    巴扎黑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(){}; mengembalikan false kerana anda telah salah faham fungsi fungsi ini

    Object.hasOwnProperty.toString.call(Number) adalah output sebagai function Number() { [native code] } kerana Object.hasOwnProperty.toString akan mengembalikan fungsi constructor objek dalam bentuk rentetan, dan kaedah panggilan meminjam daripada Object.hasOwnProperty toString kaedah.

    balas
    0
  • Batalbalas