在前端开发中,有时候我们需要定义一些只读的属性,这些属性不能被修改。虽然在 ES6 中新增了 const
关键字,可以声明常量,但是常量只能保证变量的引用不变,而无法保证内部属性的值不被修改。那么在纯 JavaScript 中,我们如何实现只读属性呢?
实现方式
JavaScript 中有一个对象特性叫做 Object.defineProperty(),它可以定义一个对象的属性,并设置该属性的特性(get、set、value、writable、enumerable 和 configurable 等)。通过设置 writable
属性为 false
,就可以将属性设置为只读。
以下代码演示了如何使用 Object.defineProperty()
以及如何实现只读属性:
let person = {}; Object.defineProperty(person, "name", { value: "Jack", writable: false, }); person.name = "Tom"; // 抛出 TypeError 错误 console.log(person.name); // 输出 "Jack"
深入理解
了解了 Object.defineProperty()
的基本使用方法后,我们来深入理解只读属性的本质。
在 JavaScript 中,每个对象都有一个原型链,原型链上的每个对象都拥有自己的属性。当我们访问一个对象的属性时,如果该对象本身没有该属性,JavaScript 引擎会沿着原型链向上查找,直到找到一个拥有该属性的对象为止。如果在整个原型链上都没有找到该属性,则返回 undefined
。
在实现只读属性时,我们需要利用 Object.defineProperty()
设置属性描述符中的 get
方法。当访问该属性时,该 get
方法会被调用,并返回属性值。而由于 writable: false
,所以无法通过赋值来修改该属性,从而实现了只读属性。
以下示例代码展示了如何使用 get
方法:
-- -------------------- ---- ------- --- ------ - - ---------- ------ --------- -------- --- ---------- - ------ -------------- - - - - -------------- -- -- ----------------------------- -- -- ---- ------ --------------- - ----- ----- -- -- --------- --
指导意义
实现只读属性是前端开发中常见的需求之一,能够帮助我们保证程序的正确性和安全性。在实际开发中,我们可以通过 Object.defineProperty()
或者 ES6 中的 class
、getter
、setter
等语法来实现只读属性。
除此之外,在面试中也经常会遇到关于只读属性的问题,因此了解只读属性的本质和实现方式,对于我们进入大厂或者提升技能水平都非常有帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/26062