iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何打印Proxy对象和ref对象的包
  • 481
分享到

如何打印Proxy对象和ref对象的包

2023-07-04 14:07:45 481人浏览 独家记忆
摘要

本文小编为大家详细介绍“如何打印Proxy对象和ref对象的包”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何打印Proxy对象和ref对象的包”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。目标我希望新的co

本文小编为大家详细介绍“如何打印Proxy对象和ref对象的包”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何打印Proxy对象和ref对象的包”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

目标

我希望新的console.log可以像现在的console.log一模一样,只是当打印Proxyref对象时可以直接输出它的源对象或ref.value。并且,还保留记录当前文件和行数的功能,可以让我看到到底是哪个文件哪个步骤执行的打印。

结果

如何打印Proxy对象和ref对象的包

但退而求其次,我用console.traceError.stack两种方式十分简陋的完成了这个目标。

如何打印Proxy对象和ref对象的包

实现(直接看源码的同学可以略过)

判断一个对象是否是Proxy

这个不好判断,vue3添加了isProxy 方法,但如果不是Vue环境的话,那这个方法就失效了。 而且就这么一个简单的小功能,实在没必要依赖其他的包。 最终是选择在用户new Proxy之前,把Proxy对象改造。

// 记录用户new Proxy操作的所有对象// WeakSet,WeakMap,都是弱引用,不干预其他模块的垃圾回收机制export const proxyMap = new WeakMap()let OriginalProxy = nullexport function listenProxy() {    if (OriginalProxy) { // 防止用户多次调用监听        return    }    OriginalProxy = window.Proxy    window.Proxy = new Proxy(Proxy, {        construct(target, args) {            const newProxy = new OriginalProxy(...args)            proxyInstances.set(newProxy, target)            return newProxy        },        get(obj, prop) {            // https://developer.mozilla.org/zh-CN/docs/WEB/javascript/Reference/Global_Objects/Symbol/hasInstance            if (prop === Symbol.hasInstance) { // 监控 `instanceof` 关键字                return instance => proxyMap.has(instance)            }            // Https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect/get            return Reflect.get(...arguments)        }    })}export function unListenProxy() {    window.Proxy = OriginalProxy || window.Proxy}

输出用户log的源对象

按说我们上一步已经监控了用户动作,可以获取源对象,等用户log的时候,我们直接输出源对象就可以了。但这也有个问题,Proxy毕竟不是普通的对象,通过Proxy获取的结果,很可能跟源对象没有一毛钱关系。所以只能通过深克隆返回源对象的值,但这也有个问题,就是对于某些不能遍历的对象或属性,就打印不了了……

问题貌似死了,但,我们实际运用中,只是为了简简单单输出一个不用展开的源对象而已,甚至运用场景都特别单一:Vue3! 用户如果觉得打印的不准确,换一个api不完了吗,比如我们监控的是console.log,那用户就用console.info一样能输出相同的结果。 把选择权交给用户就好了。在引用包的时候,再写多一个配置项,让用户自己选平时的使用场景哪个正确结果比较多,就选哪个。想要完全正确,就换一个其他的api。

我简直是个天才,哈哈哈

export function getOrg(obj) {    return proxyMap.get(obj)}// 深克隆export function clone(obj, _refs = new WeakSet()) {    if (obj === null || obj === undefined) return null    if (typeof obj !== 'object') return obj    if (obj.constructor === Date) return new Date(obj)    if (obj.constructor === RegExp) return new RegExp(obj)    const newObj = new obj.constructor() //保持继承的原型    for (const key in obj) {        if (obj.hasOwnProperty(key)) {            const val = obj[key]            if (typeof val === 'object' && !_refs.has(val)) {                newObj[key] = clone(val)            } else {                newObj[key] = val            }        }    }    return newObj}

最后暴露出去给用户调用

import { listenProxy, unListenProxy, clone, getOrg } from "./until";let config = {    key: 'log', // any String    type: 'trace', // 'trace' | 'error' | 'any String'    cloneProxy: getOrg}let Vue = {}export default function (obj = {}, vue) {    Vue = vue || {}    config = { ...config, ...obj }    if (obj.copy === 'clone') {        config.cloneProxy = clone    }    listenLog(config)}// ----------------------------------------const { groupCollapsed, groupEnd, trace, log } = console// const type = 'trace' | 'error' | ''function listenLog() {    const isRef = Vue.isRef || (obj => {        return typeof obj === 'object' && !!obj.constructor && obj.constructor.name === 'RefImpl'    })    const unref = Vue.unref || (obj => obj.value)    const { key, type, cloneProxy } = config    if (!key) {        console.error('Missing required parameter: key')    }    listenProxy() // 为 new Proxy 对象添加 `instanceof` 支持    console[key] = function (...arr) {        const newArr = arr.map(i => {            if (isRef(i)) {                return unref(i)            } else if (i instanceof Proxy) {                return cloneProxy(i)            } else {                return i            }        })        groupCollapsed(...newArr)        // 以 trace        if (type === 'trace') {            // trace(...newArr)            console.log('第二行即为调用者所在的文件位置')            trace('The second line is the file location of the caller')            groupEnd()            return        }        let stack = new Error().stack || ''        // stack = stack.replace('Error', 'Log')        if (type === 'error') {            log('%c这不是一个错误,请点击第二行的"at",跳转到对应的文件', 'color: #008000')            log('%cThis is not an error. Please click "at" in the second line to jump to the corresponding file', 'color: #008000')            log(stack)            groupEnd()            return;        }        // 简单输入模式,控制台看起来是简单了,却失去了点击链接直接跳转到对应文件的功能        const stackArr = stack.match(/at.*\s/g) || []        log(stackArr[1])        groupEnd()    }}

再加上一点ts的解释文件,那这个库就能运行在所有平台了

读到这里,这篇“如何打印Proxy对象和ref对象的包”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何打印Proxy对象和ref对象的包

本文链接: https://www.lsjlt.com/news/345960.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何打印Proxy对象和ref对象的包
    本文小编为大家详细介绍“如何打印Proxy对象和ref对象的包”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何打印Proxy对象和ref对象的包”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。目标我希望新的co...
    99+
    2023-07-04
  • 如何使用Proxy对象
    本篇内容介绍了“如何使用Proxy对象”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、聊一聊代理在日常工...
    99+
    2024-04-02
  • 怎么打印Python对象
    本篇内容主要讲解“怎么打印Python对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么打印Python对象”吧!pprint 是“pretty printer”的简写,“pretty”的含...
    99+
    2023-06-02
  • JavaScript的Proxy对象详解
    目录一、Proxy 是什么?二、怎么用?1、使用 Proxy 的简单实例2、目标对象被正确修改3、使用 set handler 做数据验证4、扩展构造函数总结一、Proxy 是什么?...
    99+
    2024-04-02
  • vue3中的对象时为proxy对象如何获取值(两种方式)
    目录第一种获取target值的方式:第二种获取target值PS:vue3中获取proxy包裹的数据前言一、具体问题二、解决办法使用vue3.0时,因为底层是使用proxy进行代理的...
    99+
    2023-01-28
    vue3 proxy对象获取值 vue3中获取proxy包裹的数据 vue3获取target值
  • PHP对象面试题:如何打包和解包数据?
    在PHP中,我们经常需要将数据打包成对象或从对象中解包数据。这是一种常见的操作,因此在面试中可能会被问及相关的问题。在本篇文章中,我们将探讨如何打包和解包数据,以及一些相关的面试题目。 一、什么是打包和解包数据? 打包数据是将数据转换为可...
    99+
    2023-10-18
    对象 面试 打包
  • 浅析JavaScript中的Proxy对象
    目录什么是ProxyProxy的用途数据验证日志记录性能分析缓存创建Proxy对象Proxy的限制总结什么是Proxy Proxy是JavaScript的一个内置对象,它允许您拦截并...
    99+
    2023-03-14
    JavaScript Proxy对象 JavaScript Proxy
  • java怎么打印list中的对象
    在Java中,可以使用循环遍历List中的对象,并打印出每个对象的内容。可以通过以下代码实现: List<String>...
    99+
    2024-03-13
    java
  • Java中如何索引对象并打包?
    在Java开发中,我们常常需要对一些对象进行索引和打包,以便于快速访问和传输。本文将介绍Java中如何索引对象并打包的方法。 一、使用HashMap进行对象索引 HashMap是Java中常用的一种数据结构,它可以用来存储键值对,其中键可...
    99+
    2023-08-11
    索引 对象 打包
  • Python print函数:如何将对象打印输出
    目录描述语法使用示例打印对象指定分隔符打印到文件设定结尾字符串print与__repr__描述 print函数是Python的内置函数,它会将对象的__repr__特殊函数返回的字符...
    99+
    2024-04-02
  • jQuery对象和DOM对象如何转换
    jQuery对象和DOM对象如何转换?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。jquery是什么jquery是一个简洁而快速的JavaScript库,它具有...
    99+
    2023-06-14
  • Java 打包:如何正确地处理对象?
    在 Java 中,打包是非常重要的一个概念。打包是指将一个或多个类文件打包成一个 jar 文件。如果你想在多个项目中重用代码,打包是必不可少的。但是,在打包过程中,如何正确地处理对象是非常重要的。本文将介绍如何正确地处理对象,以及如何在打...
    99+
    2023-10-04
    打包 对象 学习笔记
  • 当地图对象被互斥锁锁定时打印地图对象
    php小编小新在这里向大家介绍一个关于互斥锁的实用技巧:当地图对象被互斥锁锁定时,如何打印地图对象。互斥锁是一种用于保护共享资源的机制,确保同时只有一个线程可以访问被锁定的资源。在本文...
    99+
    2024-02-10
  • js中console如何在一行内打印字符串和对象
    这篇文章将为大家详细讲解有关js中console如何在一行内打印字符串和对象,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在前端开发中,大多数的调试一般都是F12中的co...
    99+
    2024-04-02
  • Java 打包对象:如何避免常见错误?
    在 Java 程序中,我们经常需要将多个对象打包成一个对象进行传输或存储,这个过程被称为“打包”。打包的目的是为了方便传输和存储,同时也可以提高程序的效率。但是,在打包的过程中,我们经常会遇到一些常见的错误,比如序列化错误、反序列化错误等...
    99+
    2023-10-04
    打包 对象 学习笔记
  • PHP对象面试题:如何高效地打包和解包数据?
    在PHP开发中,我们经常需要处理数据的打包和解包。对于一些大型项目,这个过程可能会非常频繁,因此需要一个高效的解决方案。本文将介绍一些有用的技巧,让您能够在PHP中高效地打包和解包数据。 使用PHP的序列化和反序列化功能 PHP提供了...
    99+
    2023-10-18
    对象 面试 打包
  • JavaScript中的Proxy对象怎么使用
    本篇内容主要讲解“JavaScript中的Proxy对象怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript中的Proxy对象怎么使用”吧!什么是ProxyProxy是Ja...
    99+
    2023-07-05
  • 如何将JavaScript对象转成jQuery对象数组对象
    JavaScript 是一种高级的动态编程语言,非常流行。它使得网页在不需要刷新页面的情况下变得更加动态和交互性。然而,当 JavaScript 开发变得越来越复杂,常常需要处理大量的 HTML 元素,这时候就需要用到 jQuery。jQu...
    99+
    2023-05-14
  • js对象如何转换jquery对象
    这篇文章将为大家详细讲解有关js对象如何转换jquery对象,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 js对象转换jquery对象的方法...
    99+
    2024-04-02
  • java直接打印对象的方法是什么
    在Java中,可以使用`System.out.println()`方法来直接打印对象。这个方法会自动调用对象的`toString()...
    99+
    2023-10-11
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作