JavaScript对象属性设置和屏蔽技巧

yizhihongxing

关于JavaScript对象属性设置和屏蔽技巧,我从下面的几个方面详细阐述:

禁止增加属性

我们可以使用 Object.preventExtensions() 方法来禁止对象增加属性。如果我们尝试给一个被禁止增加属性的对象增加属性,就会失败并抛出错误。

const obj = { a: 1, b: 2 };
Object.preventExtensions(obj);

obj.c = 3; // TypeError: Cannot add property c, object is not extensible

冻结对象

我们可以使用 Object.freeze() 方法来冻结对象,从而防止对象的属性被修改和删除。如果我们尝试修改和删除一个被冻结的对象,就会失败并抛出错误。

const obj = { a: 1, b: 2 };
Object.freeze(obj);

obj.a = 3;   // TypeError: Cannot assign to read only property 'a' of object '#<Object>'
delete obj.b; // TypeError: Cannot delete property 'b' of #<Object> which is non-configurable and can't be deleted

// 可以通过 Object.isFrozen() 方法来检查一个对象是否被冻结
console.log(Object.isFrozen(obj)); // true

属性的设置和屏蔽

当我们给一个对象的属性设置了值后,我们可以通过屏蔽机制来控制访问该属性时返回的值。在访问属性时,JavaScript 引擎会检查该属性是否存在于对象本身上,如果不存在,它会沿着原型链一直查找到 Object.prototype 上。但是如果对象本身上存在该属性,无论该属性的值是什么,它都将遮盖原型链上该属性的值。

以下是一个示例:

const obj1 = { a: 1 };
const obj2 = { 
    b: 2, 
    get a() {
        return 3;
    } 
};

console.log(obj1.a); // 1
console.log(obj2.a); // 3

Object.setPrototypeOf(obj1, obj2); // 将 obj1 的原型设置为 obj2
console.log(obj1.a); // 1,因为 obj1 本身有 a 属性,不需要沿着原型链查找

从上面的示例可以看出,当我们通过 Object.setPrototypeOf() 方法将 obj1 的原型设置为 obj2 时,尽管 obj2 上的 a 属性的值为 3,但是在访问 obj1.a 时返回的是 obj1 本身上的 a 属性的值 1。原因是对象本身上的属性值会覆盖原型链上的同名属性值。可以通过在子对象中重新定义该属性来解决这个问题。

以下是通过在子对象中重新定义该属性的示例:

const obj1 = { a: 1 };
const obj2 = { 
    b: 2, 
    get a() {
        return 3;
    } 
};

console.log(obj1.a); // 1
console.log(obj2.a); // 3

Object.setPrototypeOf(obj1, obj2); // 将 obj1 的原型设置为 obj2
console.log(obj1.a); // 1,因为 obj1 本身有 a 属性,不需要沿着原型链查找

// 在 obj1 对象本身上重新定义 a 属性
Object.defineProperty(obj1, 'a', {
    value: 4,
    writable: true,
    configurable: true,
    enumerable: true
});

console.log(obj1.a); // 4
console.log(obj2.a); // 3

从上面的示例可以看出,在 obj1 对象本身上重新定义 a 属性后,再访问 obj1.a 时返回的是实例上的属性值 4,而 obj2 上的 a 属性的值仍然是 3。因为子对象中重新定义的属性会屏蔽原型链上的同名属性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript对象属性设置和屏蔽技巧 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaScript 克隆数组最简单的方法

    下面是详细的“JavaScript 克隆数组最简单的方法”的攻略: 标题 JavaScript 克隆数组最简单的方法 简介 在JavaScript中,我们经常需要对数组进行操作,有时候需要创建数组的副本。本篇文章将讲述最简单的JavaScript克隆数组的方法及其示例。 代码实现 JavaScript克隆数组有以下两种方法: 1. 使用 Array.from…

    JavaScript 2023年5月27日
    00
  • iOS WKWebView适配实战篇

    iOS WKWebView适配实战篇的完整攻略主要涉及以下几个方面: 1. 了解WKWebView WKWebView是苹果官方提供的一个用于iOS和macOS平台的现代化Web视图,可以直接预览网页,还支持JavaScriptCore和WebViewJavascriptBridge等桥接方式。相比于旧版的UIWebView,WKWebView更加内存友好、…

    JavaScript 2023年6月11日
    00
  • C#实现将javascript文件编译成dll文件的方法

    下面是详细讲解“C#实现将JavaScript文件编译成DLL文件的方法”的完整攻略: 1. 准备工作 在开始之前,你需要安装以下工具: Visual Studio(建议安装2019版本或更高版本) Jurassic 一个基于.NET的javascript解释器 2. 创建新的C#项目 打开Visual Studio,创建一个新的Class Library项…

    JavaScript 2023年5月27日
    00
  • 用js实现轮播图效果

    实现轮播图效果的一般思路: 1.准备好轮播图所需的HTML结构:容器元素、轮播图图片、圆点等。 2.通过CSS实现轮播图的样式,包括图片的大小、位置、圆点的样式等。 3.通过JavaScript实现轮播图的功能,包括自动播放、手动切换、圆点切换等。 以下是具体的实现步骤和代码示例: 一、HTML结构 HTML结构一般包括轮播图容器元素、图片元素及圆点元素,如…

    JavaScript 2023年6月11日
    00
  • JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例

    下面我将详细讲解JavaScript处理HTML事件、键盘事件、鼠标事件的攻略,包括基础概念、代码实现和示例说明。 HTML事件 基础概念 HTML事件是页面元素在浏览器中发生的特定操作,如点击、鼠标移动、键盘按下等。在JavaScript中,我们可以通过事件驱动来实现对HTML事件的处理。 代码实现 // 获取对应元素 var ele = document…

    JavaScript 2023年6月11日
    00
  • JavaScript门道之标准库

    JavaScript 标准库是指由 ECMAScript 提供的可在 Web 应用程序中直接使用的库。它包含一组全局对象,例如 Object,Array,Date 和 Error,并提供了一组通用的函数,例如 parseInt 和 parseFloat 等。JavaScript 标准库是在 JavaScript 运行时环境中自动加载的,因此不需要额外下载或引…

    JavaScript 2023年5月19日
    00
  • Javascript标准DOM Range操作全集

    JavaScript标准DOM Range操作是指通过JavaScript代码对网页上指定的文本片段(如文本块或元素节点)进行操作,包括选取、添加、替换、删除等操作。这篇攻略将会介绍针对DOM Range对象的常见操作,为读者提供DOM Range的完整使用指南。 什么是DOM Range DOM Range是一个用于描述文档中某个范围(即一段连续的文本或一…

    JavaScript 2023年5月27日
    00
  • JavaScript中的数据类型介绍

    当我们使用JavaScript进行编程时,数据类型是我们需要了解的基础之一。JavaScript中的数据类型包括基本数据类型和复杂数据类型。 基本数据类型 JavaScript中的基本数据类型有以下五种: 1.数字类型(Number) 表示数字,举个例子: let num = 3; 2.字符串类型(String) 表示字符串,举个例子: let str = …

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