改进机能的最好要领:JavaScript耽误执行属性
副问题[/!--empirenews.page--]
优化执行计较操纵的最简朴要领是比及必要数据后再举办计较。 譬喻,您可以行使带有getter的data属性来按需举办计较,如下所示: 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,而且被配置为不行写,不行设置和可列举。 下次data会见该属性时,它将重新建设的属性中读取而不是挪用getter: const object = new MyClass(); // calls the getter const data1 = object.data; // reads from the data property const data2 = object.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()再次挪用它。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |