超越Jquery_01_isPlainObject分析与重构

超越Jquery_01_isPlainObject分析与重构

1. isPlainObject函数分析

isPlainObject函数用于判断传入的对象是否为纯粹的JavaScript对象。具体实现如下:

function isPlainObject(obj) {
  var proto, Ctor;

  // 剔除null和非对象类型
  if (!obj || {}.toString.call(obj) !== "[object Object]") {
    return false;
  }

  proto = Object.getPrototypeOf(obj);

  // 没有原型的对象为纯粹的JavaScript对象
  if (!proto) {
    return true;
  }

  // 构造函数的原型为Object的实例
  Ctor = {}.hasOwnProperty.call(proto, "constructor") && proto.constructor;
  return typeof Ctor === "function" && {}.toString.call(Ctor) === {}.toString.call(Object);
}
  • 首先判断传参是否为null或者非对象类型,如果是则返回false;
  • 然后获取对象的原型对象。
  • 没有原型对象的是普通对象(遵循ECMAScript规范),将其视为纯粹对象;
  • 通过对象原型判断对象是否通过自定义构造函数生成,如果是则从构造函数原型上查询是否存在Object构造函数,此时这个对象就被视为纯粹JS对象返回true。

2. isPlainObject函数存在的问题

虽然isPlainObject函数能够比较准确地判断传入的对象是否为纯粹JavaScript对象,但是它并没有完美的解决问题:

  1. 不支持对空对象进行判断
  2. 对于DOM节点和window对象也会认为其是普通对象
  3. 还有通过自定义函数生成的对象,如果该函数的原型链上存在Object构造函数,也会被识别为纯粹JavaScript对象,但并非如此。

3. isPlainObject函数重构

下面的代码能够对isPlainObject函数进行完美的重构:

function isPlainObject(obj) {
    // 判断是否为对象类型
    if (!obj || typeof obj !== 'object' || obj.nodeType || obj.window === obj) {
        return false;
    }

    // 是否拥有Object原型链上的isPrototypeOf属性
    if (obj.constructor && !Object.prototype.hasOwnProperty.call(obj.constructor.prototype, 'isPrototypeOf')) {
        return false;
    }

    return true;
}
  • 首先,判断是否为非null的对象类型或者非window的全局对象;
  • 如果是DOM节点或全局window对象,则返回false;
  • 如果是自定义构造函数生成的对象,则无法通过Object.prototype去验证其是否具有isPrototypeOf属性,也返回false;
  • 如果存在isPrototypeOf属性,则一定为纯粹对象。

4. 示例说明

例如,在以下的情况下,isPlainObject函数就会存在不准确的情况:

// 定义一个自定义构造函数
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// 调用自定义构造函数创建对象
var person1 = new Person('张三', 18);
var isPureObject1 = $.isPlainObject(person1); // 这里将被识别为纯粹对象,因为Person的原型链上存在Object构造函数

// 如下的情况则不会被题识别为纯粹对象,因为obj定义即为空对象
var obj = {};
var isPureObject2 = $.isPlainObject(obj); // 这里也会被误认为不是纯粹对象。

最终,通过isPlainObject函数重构,能够避免以上两种情况的误判。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:超越Jquery_01_isPlainObject分析与重构 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • TS 中 never,void,unknown类型详解

    那么我们来详细讲解一下 TS 中 never、void 和 unknown 类型的相关知识点。 never 类型 never 类型表示永不存在的类型。也就是说,无法终止的函数或者总是抛出错误的函数的返回类型就是 never。 在实际使用中,通常用于处理不应该出现的情况或者用于避免编写无用的代码。 下面是一个示例函数,它总是会抛出异常: function th…

    JavaScript 2023年6月10日
    00
  • 最新热门脚本Autojs源码分享

    最新热门脚本Autojs源码分享攻略 Autojs是一款Android平台下的JavaScript自动化工具,可以实现自动点击、滑动、输入等操作。同时也是一个优秀的脚本引擎,支持JavaScript语法和ES6规范。在Autojs社区中,可以找到各种各样的脚本,涵盖了各种应用场景。这篇攻略将详细讲解如何获取、使用Autojs脚本以及如何调试脚本。 步骤一:获…

    JavaScript 2023年6月10日
    00
  • 浅谈JavaScript中内存泄漏的几种情况

    浅谈 JavaScript 中内存泄漏的几种情况 JavaScript 作为一门动态语言,具有自动垃圾回收机制,可以自动管理内存,以使程序运行更加高效。然而,由于某些原因,一些对象可能会无法被垃圾收集器正确回收,导致内存泄漏。本文将介绍几种常见的 JavaScript 内存泄漏情况。 1. 全局变量 在 JavaScript 中,变量分为全局变量和局部变量。…

    JavaScript 2023年6月10日
    00
  • JavaScript起点(严格模式深度了解)

    JavaScript起点(严格模式深度了解) 什么是严格模式? 严格模式是 ECMAScript 5 引入的一种运行模式,主要作用是弥补了 JavaScript 语言本身一些缺陷,提高了代码的运行效率,增强了安全性。通过开启严格模式,可以使 JavaScript 代码更加规范、更加安全、更加高效。 开启严格模式有两种方式: 在全局环境中使用 ‘use str…

    JavaScript 2023年5月19日
    00
  • 工作中常用到的JS表单验证代码(包括例子)

    让我们来详细讲解一下工作中常用到的JS表单验证代码。 1. 前言 在现代Web应用程序中,表单是非常重要的一部分。表单的验证是保证用户数据输入的准确性和安全性的重要手段之一。JavaScript的表单验证是一种常见的方式,能够迅速的检测并提示用户错误输入信息。 2. 表单验证的基本原则 在讲解具体的JS表单验证代码之前,我们先来了解一下表单验证的基本原则。 …

    JavaScript 2023年6月10日
    00
  • js弹出窗口返回值的简单实例

    下面我为你详细讲解“js弹出窗口返回值的简单实例”的完整攻略。 1. 简介 弹出窗口是指在当前页面之上打开另一个小窗口,通常用于提示/确认信息、输入数据等,其返回值也通常用于将弹出窗口中的数据传递到主页面。而在基于web技术的网站中,JavaScript是用来实现弹出窗口功能的主要技术。 2. 实现流程 2.1 弹出窗口 首先,在打开弹出窗口的链接/按钮中需…

    JavaScript 2023年6月11日
    00
  • JS数组方法shift()、unshift()用法实例分析

    JS数组方法shift()和unshift()是数组操作中非常常用的方法,两个方法都可以用于向数组的开头添加或删除元素,下面详细讲解这两个方法的用法及实例分析。 shift() 方法的用法及实例分析 shift()方法用于删除数组的第一个元素,并返回被删除的元素。 语法: array.shift() 参数说明: shift()方法不需要任何参数。 返回值: …

    JavaScript 2023年5月27日
    00
  • Js event事件在IE、FF兼容性问题

    下面是关于Js event事件在IE、FF兼容性问题的完整攻略: 1. 事件模型的差异 在Web页面中,事件是一种观察者模式的设计模式,即在一个对象上发生事件时,其它对象可以得到通知并做出相应的的处理。 但是,IE与其它主流浏览器的事件模型存在差异。IE采用了“事件冒泡”模型,而其它主流浏览器则采用了“事件捕获”模型。 事件冒泡模型 事件从最具体的元素开始发…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部