返回顶部
首页 > 资讯 > 前端开发 > JavaScript >一文读懂JavaScript 中的延迟加载属性模式
  • 187
分享到

一文读懂JavaScript 中的延迟加载属性模式

2024-04-02 19:04:59 187人浏览 泡泡鱼
摘要

传统上,开发人员在 javascript 类中为实例中可能需要的任何数据创建属性。对于在构造函数中随时可用的小块数据来说,这不是问题。但是,如果在实例中可用之前需要计算某些数据,您可

传统上,开发人员在 javascript 类中为实例中可能需要的任何数据创建属性。对于在构造函数中随时可用的小块数据来说,这不是问题。但是,如果在实例中可用之前需要计算某些数据,您可能不想预先支付该费用。例如,考虑这个类:


class MyClass {
    constructor() {
        this.data = someExpensiveComputation();
    }
}

在这里,data属性是作为执行一些昂贵计算的结果而创建的。如果您不确定是否会使用该属性,则预先执行该计算可能效率不高。幸运的是,有几种方法可以将这些操作推迟到以后。

按需属性模式

优化执行昂贵操作的最简单方法是等到需要数据后再进行计算。例如,您可以使用带有 getter 的访问器属性来按需进行计算,如下所示:


class MyClass {
    get data() {
        return someExpensiveComputation();
    }
}

在这种情况下,直到有人第一次读取该data属性时,您的昂贵计算才会发生,这是一种改进。但是,每次data读取属性时都会执行相同的昂贵计算,这比之前的示例更糟糕,其中至少只执行了一次计算。这不是一个好的解决方案,但您可以在此基础上创建一个更好的解决方案。

凌乱的延迟加载属性模式

只有在访问属性时才执行计算是一个好的开始。您真正需要的是在该点之后缓存信息并仅使用缓存版本。但是您将这些信息缓存在哪里以便于访问?最简单的方法是定义一个具有相同名称的属性并将其值设置为计算数据,如下所示:


class MyClass {
    get data() {
        const actualData = someExpensiveComputation();
 
        Object.defineProperty(this, "data", {
            value: actualData,
            writable: false,
            configurable: false,
            enumerable: false
        });
 
        return actualData;
    }
}

在这里,该data属性再次定义为类上的 getter,但这次它缓存了结果。调用Object.defineProperty()创建一个名为的新属性data,该属性具有固定值actualData,并且设置为不可写、可配置和不可枚举(以匹配 getter)。之后,返回值本身。下次data访问该属性时,它将从新创建的属性中读取而不是调用 getter:


const object = new MyClass();
 
// calls the getter
const data1 = object.data;
 
// reads from the data property
const data2 = object.data;

实际上,所有计算仅在第一次data读取属性时完成。对该data属性的每次后续读取都返回缓存的版本。

这种模式的一个缺点是data属性开始是不可枚举的原型属性,最终是不可枚举的自己的属性:


const object = new MyClass();
console.log(object.hasOwnProperty("data"));     // false
 
const data = object.data;
console.log(object.hasOwnProperty("data"));     // true

虽然这种区别在很多情况下并不重要,但理解这种模式很重要,因为它在传递对象时可能会导致微妙的问题。幸运的是,使用更新的模式很容易解决这个问题。

类的唯一自己的延迟加载属性模式

如果您有一个用例,其中延迟加载的属性始终存在于实例中很重要,那么您可以使用Object.defineProperty()在类构造函数中创建属性。它比前面的例子有点混乱,但它会确保该属性只存在于实例上。下面是一个例子:


class MyClass {
    constructor() {

        Object.defineProperty(this, "data", {
            get() {
                const actualData = someExpensiveComputation();

                Object.defineProperty(this, "data", {
                    value: actualData,
                    writable: false,
                    configurable: false
                });

                return actualData;
            },
            configurable: true,
            enumerable: true
        });

    }
}

在这里,构造函数data使用Object.defineProperty().该属性是在实例上创建的(通过使用this)并定义一个 getter 并指定该属性为可枚举和可配置的(典型的自己的属性)。将data属性设置为可配置特别重要,以便您可以Object.defineProperty()再次调用它。

然后 getter 函数进行计算并再次调用Object.defineProperty()。该data属性现在被重新定义为具有特定值的数据属性,并且不可写和不可配置以保护最终数据。然后,计算数据从 getter 返回。下次data读取属性时,它将从存储的值中读取。作为奖励,该data财产现在仅作为自己的财产存在,并且在第一次阅读之前和之后的行为都相同:


const object = new MyClass();
console.log(object.hasOwnProperty("data"));     // true
 
const data = object.data;
console.log(object.hasOwnProperty("data"));     // true

对于类,这很可能是您要使用的模式;另一方面,对象文字可以使用更简单的方法。

对象字面量的延迟加载属性模式

如果您使用对象字面量而不是类,则过程要简单得多,因为在对象字面量上定义的 getter 被定义为可枚举的自身属性(而不是原型属性),就像数据属性一样。这意味着您可以对类使用凌乱的延迟加载属性模式而对于对象来说不会凌乱:


const object = {
    get data() {
        const actualData = someExpensiveComputation();
 
        Object.defineProperty(this, "data", {
            value: actualData,
            writable: false,
            configurable: false,
            enumerable: false
        });
 
        return actualData;
    }
};
 
console.log(object.hasOwnProperty("data"));     // true
 
const data = object.data;
console.log(object.hasOwnProperty("data"));     // true

结论

在 JavaScript 中重新定义对象属性的能力提供了一个独特的机会来缓存可能计算成本很高的信息。通过从重新定义为数据属性的访问器属性开始,您可以将计算推迟到第一次读取属性时,然后缓存结果以供以后使用。这种方法既适用于类,也适用于对象字面量,并且在对象字面量中更简单一些,因为您不必担心您的 getter 会在原型上结束。

提高性能的最佳方法之一是避免重复执行相同的工作,因此任何时候您可以缓存结果以供以后使用,都可以加快程序的运行速度。延迟加载属性模式等技术允许任何属性成为缓存层以提高性能。

以上就是JavaScript 中的延迟加载属性模式的详细内容,更多关于js延迟加载属性的资料请关注编程网其它相关文章!

--结束END--

本文标题: 一文读懂JavaScript 中的延迟加载属性模式

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

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

猜你喜欢
  • 一文读懂JavaScript 中的延迟加载属性模式
    传统上,开发人员在 JavaScript 类中为实例中可能需要的任何数据创建属性。对于在构造函数中随时可用的小块数据来说,这不是问题。但是,如果在实例中可用之前需要计算某些数据,您可...
    99+
    2024-04-02
  • 浅谈JavaScript 中的延迟加载属性模式
    目录一、前言二、按需属性模式三、凌乱的延迟加载属性模式四、类的唯一自己的延迟加载属性模式五、对象字面量的延迟加载属性模式六、结论一、前言 传统上,开发人员在 JavaScript 类...
    99+
    2024-04-02
  • JavaScript中延迟加载属性的原理和用法
    本篇内容介绍了“JavaScript中延迟加载属性的原理和用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • 一文了解mybatis的延迟加载
    目录1. 什么时候会创建代理对象2. 如何使用3.延迟加载的好处本文主要介绍下mybatis的延迟加载,从原理上介绍下怎么使用、有什么好处能规避什么问题。延迟加载一般用于级联查询(级...
    99+
    2024-04-02
  • CSS属性实现响应式图片延迟加载的方法
    CSS属性实现响应式图片延迟加载的方法在网页开发中,经常会遇到需要加载大量图片的情况,特别是在移动设备上。为了提高页面的加载速度和用户体验,延迟加载(lazy loading)图像成为一种常见的优化方法。延迟加载是指在页面加载时,只加载可见...
    99+
    2023-11-18
    响应式 延迟加载 CSS属性
  • Javascript中如何实现图片的延迟加载
    这篇文章主要介绍Javascript中如何实现图片的延迟加载,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Javascript之图片的延迟加载的实例详解作用:保证页面打开的速度(3s...
    99+
    2024-04-02
  • 一文读懂Java中代码的加载顺序
    本篇文章为大家展示了一文读懂Java中代码的加载顺序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java中代码的加载顺序所能了解的知识点类的依赖关系static代码块的加载时间继承类中构造器的隐式...
    99+
    2023-05-31
    java 加载顺序 ava
  • Angular中NgModule模块和延迟加载模块的用法
    这篇文章主要介绍“Angular中NgModule模块和延迟加载模块的用法”,在日常操作中,相信很多人在Angular中NgModule模块和延迟加载模块的用法问题上存在疑惑,小编查阅了各式资料,整理出简单...
    99+
    2024-04-02
  • 一文读懂:JavaScript 构造函数模式,从此告别迷茫!
    什么是 JavaScript 构造函数模式? JavaScript 构造函数模式是一种创建对象的模式。它使用关键字 new 来创建一个新对象。这个关键字会调用构造函数,并使用该构造函数的参数来初始化新对象。 function Perso...
    99+
    2024-02-23
    JavaScript 构造函数 对象 属性 方法
  • VUE懒加载原理详解:一文带你读懂图片懒加载的奥秘
    VUE 是一个流行的前端框架,它提供了许多开箱即用的特性,其中之一就是懒加载。懒加载的目的是延迟加载资源,以提高网页加载速度和性能。 VUE 懒加载的原理很简单,它通过一个指令(v-lazy)来实现。当该指令应用于一个元素时,浏览器就会延...
    99+
    2024-02-13
    VUE 懒加载 图片懒加载 性能优化
  • 一文带你搞懂JavaScript中数组的特性
    目录前言基本介绍数组类型和判断判断为数组的方式数组索引值和长度索引值是字符串length属性数组的最大长度创建数组的三种方式数组字面量语法Array构造函数Array.of()空位(...
    99+
    2023-05-17
    JavaScript数组特性 JavaScript数组
  • 计算机网络中网站性能延迟加载图像的示例分析
    这篇文章给大家分享的是有关计算机网络中网站性能延迟加载图像的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。由于图片是web上最流行的内容类型之一,因此网站的页面加载时间很容易成为一个问题。即使经过适当的优...
    99+
    2023-06-09
  • 一文读懂JS中的var/let/const和暂时性死区
    目录js中变量的特征变量的定义与访问简单说下作用域语法varlet与暂时性死区constjs中变量的特征 js的变量是松散类型的。变量可以用于保存任何类型的数据。所以js也被称为弱类...
    99+
    2023-02-27
    JS var let const JS var JS let JS const
  • 一文理解JavaScript中的单例模式
    JS 单例模式是一种常用的设计模式,它可以保证一个类只有一个实例。这种模式主要用于管理全局变量,避免命名冲突和重复加载,同时也可以减少内存占用,提高代码的可维护性和可扩展性。价值场景JS 单例模式通常适用于以下场景:管理全局变量使用单例模式...
    99+
    2023-05-14
    单例模式 前端 JavaScript 面试
  • 一文总结JavaScript中常见的设计模式
    目录设计原则什么是设计模式一、单例模式二、策略模式三、代理模式四、迭代器模式五、发布-订阅模式六、命令模式七、组合模式八、模板方法模式九、享元模式十、职责链模式十一、中介者模式十二、...
    99+
    2023-05-19
    JavaScript设计模式 JavaScript设计
  • Spring注解@Value及属性加载配置文件方式的示例分析
    这篇文章主要介绍了Spring注解@Value及属性加载配置文件方式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Spring中使用@Value注解给bean加载属...
    99+
    2023-06-20
  • Python中的文件读写模式和文件操作的最佳实践和性能优化是什么?
    Python中的文件读写模式和文件操作的最佳实践和性能优化是什么?在Python中,文件是一种非常常见的数据存储和交换方式。因此,了解文件读写模式以及文件操作的最佳实践和性能优化是非常重要的。文件读写模式:在Python中,open()函数...
    99+
    2023-10-25
    Python 文件操作 性能优化 最佳实践 文件读写模式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作