Maison interface Web js tutoriel 超越Jquery_01_isPlainObject分析与重构_javascript技巧

超越Jquery_01_isPlainObject分析与重构_javascript技巧

May 16, 2016 pm 06:18 PM
分析 重构

isPlainObject是Jquery1.4后提供的新方法,用于判断对象是否是纯粹的对象(通过 "{}" 或者 "new Object" 创建的)。

使用isPlainObject
  首先我们来了解一下什么叫'纯粹的对象',简单的理解'纯粹的对象'指的就是由Object构造出来的对象。那哪些对象是由Object构造出来的呢。首当其充的肯定是由new Object()所构造出来的对象,注意:在Object后的括号里可没加任何东西。因为Object是所有'类'的根基,因此它有一些特殊的行为,如当调用new Object(3)的时候,会构造一个Number类型的对象。new Object('')会构造一个String类型的对象。然后以{}这种形式定义的对象也属于'纯粹的对象'。'{}'的实质就是new Object(),只是表现形形式不同。好,让我们来看一段代码:

复制代码 代码如下:

var objStr = new Object('');
alert(objStr.constructor);//String
alert(isPlainObject(objStr));//false
var objNum = new Object(3);
alert(objNum.constructor);//Number
alert(isPlainObject(objNum));//false
function Person(){}
var person = new Person();
alert(isPlainObject(person));//false
var obj01 = new Object();
obj01.name = '笨蛋的座右铭';
alert(isPlainObject(obj01));//true
alert(isPlainObject({name:'笨蛋的座右铭'}));//true

isPlainObject源码分析
以下代码为Jquery中的isPlainObject的完整版本,注释已经很详尽了,我就不多说什么了。
复制代码 代码如下:

var toString = Object.prototype.toString,
hasOwnProperty = Object.prototype.hasOwnProperty;
function isPlainObject( obj ) {
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
//Make sure that DOM nodes and window objects don't pass through, as well
//windows objects:toString.call(window):IE [object Object] FF [object Window] chrome [window global] safari [object DOMWindow]
//DOM nodes:toString.call(#div01):IE [object Object] FF [object Window] chrome [object global] safari [object DOMWindow]
//结论:obj.nodeType || obj.setInterval主要是针对于IE浏览器进行判断
//注:history,location,navigator,screen的setInterval为undefined
if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
return false;
}
// Not own constructor property must be Object
// 除去自定义对象和内置对象的判断,如function Person(){} var p = new Person();String,Number
if ( obj.constructor //有constructor属性
&& !hasOwnProperty.call(obj, "constructor") //并且constructor这个属性必须是在原型链中进行定义的
&& !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf")//并且原型中有isPrototypeOf方法,一般只有Object的原型中才有这个方法
) {
return false;
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
//针对于复杂类结构,如有继承...
/*
//一个简单的测试
function Animal(name){
}
function Person(name,age){
Animal.call(this,name);
this.age =age;
}
var p = new Person('jxl',20);
for(key in p){
alert(hasOwnProperty.call( p, key ))//true , false
}
*/
var key;
for ( key in obj ) {}
return key === undefined || hasOwnProperty.call( obj, key );
}

提出问题
个人感觉这个实现比较复杂,而且有BUG。
简单的BUG,history,location,navigator,screen可以顺序通过 isPlainObject的检测返回true.
来看一个我的解决方案(修改BUG,简化):
复制代码 代码如下:

function isPlainObject(obj){
if(obj&&Object.prototype.toString.call(obj)==="[object Object]"&&obj.constructor===Object &&!hasOwnProperty.call(obj, "constructor")){
var key;
for ( key in obj ) {}
return key === undefined || hasOwnProperty.call( obj, key );
}
return false;
}

还有BUG,而且是一个无解的BUG:
复制代码 代码如下:

function m(){};
m.prototype.constructor=Object; //必杀
obj=new m;
alert(isPlainObject(obj)); //true

再来一个同理的:
复制代码 代码如下:

function m(){};
m.prototype = {};
obj=new m;
alert(isPlainObject(obj)); //true

这个答案是无解的!

解答无解
本以为这个问题很好解决,结果深入后,发现这是一个无解的问题。原因如下:
复制代码 代码如下:

function Person(){};
Person.prototype.constructor=Object;
var person=new Person;

让我们来看一下person现在的状态:
超越Jquery_01_isPlainObject分析与重构_javascript技巧
person和其构造函数Person唯一的联系就是其prototype链中的constructor属性。而在我们判断是否为'纯粹的对象'主要是依据对象实例的constructor进行的。如果我们将其指向Object,正如图中看到的那样,那么person和Person在代码上就没有关系了。也正是因为这一点,让类型的判断出现了问题。
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment implémenter des statistiques et des analyses de données dans Uniapp Comment implémenter des statistiques et des analyses de données dans Uniapp Oct 24, 2023 pm 12:37 PM

Comment implémenter les statistiques et l'analyse des données dans uniapp 1. Introduction générale Les statistiques et l'analyse des données constituent une partie très importante du processus de développement d'applications mobiles. Grâce aux statistiques et à l'analyse du comportement des utilisateurs, les développeurs peuvent avoir une compréhension approfondie des préférences et de l'utilisation des utilisateurs. habitudes. Optimisant ainsi la conception du produit et l’expérience utilisateur. Cet article présentera comment implémenter des statistiques de données et des fonctions d'analyse dans uniapp, et fournira quelques exemples de code spécifiques. 2. Choisissez les outils de statistiques et d'analyse de données appropriés. La première étape pour mettre en œuvre les statistiques et l'analyse de données dans uniapp consiste à choisir les outils de statistiques et d'analyse de données appropriés.

Analyse des raisons pour lesquelles le répertoire secondaire du CMS DreamWeaver ne peut pas être ouvert Analyse des raisons pour lesquelles le répertoire secondaire du CMS DreamWeaver ne peut pas être ouvert Mar 13, 2024 pm 06:24 PM

Titre : Analyse des raisons et des solutions pour lesquelles le répertoire secondaire de DreamWeaver CMS ne peut pas être ouvert. Dreamweaver CMS (DedeCMS) est un puissant système de gestion de contenu open source largement utilisé dans la construction de divers sites Web. Cependant, parfois pendant le processus de création d'un site Web, vous pouvez rencontrer une situation dans laquelle le répertoire secondaire ne peut pas être ouvert, ce qui perturbe le fonctionnement normal du site Web. Dans cet article, nous analyserons les raisons possibles pour lesquelles le répertoire secondaire ne peut pas être ouvert et fournirons des exemples de code spécifiques pour résoudre ce problème. 1. Analyse des causes possibles : Problème de configuration des règles pseudo-statiques : pendant l'utilisation

Analyse de cas d'application Python dans les systèmes de transport intelligents Analyse de cas d'application Python dans les systèmes de transport intelligents Sep 08, 2023 am 08:13 AM

Résumé de l'analyse de cas d'application de Python dans les systèmes de transport intelligents : Avec le développement rapide des systèmes de transport intelligents, Python, en tant que langage de programmation multifonctionnel, facile à apprendre et à utiliser, est largement utilisé dans le développement et l'application de systèmes de transport intelligents. Cet article démontre les avantages et le potentiel d'application de Python dans le domaine du transport intelligent en analysant les cas d'application de Python dans les systèmes de transport intelligents et en donnant des exemples de code pertinents. Introduction Le système de transport intelligent fait référence à l'utilisation de moyens de communication, d'information, de détection et d'autres moyens techniques modernes pour communiquer via

Compréhension approfondie des techniques de refactoring de fonctions en langage Go Compréhension approfondie des techniques de refactoring de fonctions en langage Go Mar 28, 2024 pm 03:05 PM

Dans le développement d’un programme de langage Go, les compétences en reconstruction fonctionnelle sont un élément très important. En optimisant et en refactorisant les fonctions, vous pouvez non seulement améliorer la qualité et la maintenabilité du code, mais également améliorer les performances et la lisibilité du programme. Cet article approfondira les techniques de reconstruction de fonctions dans le langage Go, combinées à des exemples de code spécifiques, pour aider les lecteurs à mieux comprendre et appliquer ces techniques. 1. Exemple de code 1 : Extraire les fragments de code en double. Dans le développement réel, nous rencontrons souvent des fragments de code réutilisés. À l'heure actuelle, nous pouvons envisager d'extraire le code répété en tant que fonction indépendante.

Analyser si le langage de programmation principal de Tencent est Go Analyser si le langage de programmation principal de Tencent est Go Mar 27, 2024 pm 04:21 PM

Titre : Le principal langage de programmation de Tencent Go : Une analyse approfondie En tant que principale entreprise technologique chinoise, Tencent a toujours attiré beaucoup d’attention dans son choix de langages de programmation. Ces dernières années, certains pensent que Tencent adopte principalement Go comme principal langage de programmation. Cet article procédera à une analyse approfondie pour déterminer si le principal langage de programmation de Tencent est Go et donnera des exemples de code spécifiques pour étayer ce point de vue. 1. Application du langage Go dans Tencent Go est un langage de programmation open source développé par Google. Son efficacité, sa concurrence et sa simplicité sont appréciées par de nombreux développeurs.

Analyser les avantages et les inconvénients de la technologie de positionnement statique Analyser les avantages et les inconvénients de la technologie de positionnement statique Jan 18, 2024 am 11:16 AM

Analyse des avantages et des limites de la technologie de positionnement statique Avec le développement de la science et de la technologie modernes, la technologie de positionnement est devenue un élément indispensable de nos vies. La technologie de positionnement statique en fait partie. Elle présente des avantages et des limites uniques. Cet article procédera à une analyse approfondie de la technologie de positionnement statique pour mieux comprendre son état d'application actuel et ses tendances de développement futures. Examinons d’abord les avantages de la technologie de positionnement statique. La technologie de positionnement statique permet de déterminer les informations de position en observant, mesurant et calculant l'objet à positionner. Par rapport à d'autres technologies de positionnement,

Analyse des performances du code ThinkPHP6 : localisation des goulots d'étranglement des performances Analyse des performances du code ThinkPHP6 : localisation des goulots d'étranglement des performances Aug 27, 2023 pm 01:36 PM

Analyse des performances du code ThinkPHP6 : localisation des goulots d'étranglement des performances Introduction : Avec le développement rapide d'Internet, une analyse plus efficace des performances du code est devenue de plus en plus importante pour les développeurs. Cet article explique comment utiliser ThinkPHP6 pour effectuer une analyse des performances du code afin de localiser et de résoudre les goulots d'étranglement des performances. Dans le même temps, nous utiliserons également des exemples de code pour aider les lecteurs à mieux comprendre. Importance de l'analyse des performances L'analyse des performances du code fait partie intégrante du processus de développement. En analysant les performances du code, nous pouvons comprendre où beaucoup de ressources sont consommées

Analysez et résolvez les raisons pour lesquelles Tomcat plante Analysez et résolvez les raisons pour lesquelles Tomcat plante Jan 13, 2024 am 10:36 AM

Analyse des causes des crashs de Tomcat et solutions Introduction : Avec le développement rapide d'Internet, de plus en plus d'applications sont développées et déployées sur des serveurs pour fournir des services. En tant que serveur JavaWeb commun, Tomcat a été largement utilisé dans le développement d'applications. Cependant, nous pouvons parfois rencontrer des problèmes de plantage de Tomcat, ce qui entraînera un mauvais fonctionnement de l'application. Cet article présentera l'analyse des causes du crash de Tomcat, fournira des solutions et donnera des exemples de code spécifiques.

See all articles