javascript - À propos de la fonction isPlainObject dans le code source jQuery pour déterminer si un objet est un objet pur
phpcn_u1582
phpcn_u1582 2017-06-12 09:28:36
0
1
704
// 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;

Vous trouverez ci-dessous les codes mentionnés dans le code d'appel

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

Dans jQuery 3.2.1, les deux dernières lignes de la fonction qui détermine si un objet est un objet pur ne sont pas équivalentes lorsque je l'ai testé moi-même. Je voudrais demander quel est le problème

.
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

Demandez-moi

  1. Pourquoi le résultat de sortie est false

  2. Que signifie
  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] }Pourquoi

phpcn_u1582
phpcn_u1582

répondre à tous(1)
巴扎黑
    // 判断参数是不是纯粹的对象 通过{}、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(){}; renvoie false car vous avez mal compris la fonction de cette fonction. Cela ne signifie pas création via une fonction, cela signifie new Object();

Object.hasOwnProperty.toString.call(Number) est généré sous la forme d'une fonction Number() { [code natif] } car Object.hasOwnProperty.toString renverra la fonction constructeur de l'objet sous forme de chaîne et la méthode d'appel emprunte à Object.hasOwnProperty toString méthode.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal