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

关于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日

相关文章

  • js实现div拖动动画运行轨迹效果代码分享

    关于“js实现div拖动动画运行轨迹效果代码分享”的完整攻略,主要包含以下几个部分: 基本思路 实现步骤 示例说明 基本思路 实现div拖动动画运行轨迹效果,一般可以采用JS和CSS配合的方式。具体来说,主要实现以下几个步骤: 给div绑定mousedown事件,当鼠标按下时触发。 给document绑定mousemove事件,当鼠标移动时触发。 给docu…

    JavaScript 2023年6月10日
    00
  • javascript中this做事件参数相关问题解答

    下面是完整攻略: JavaScript中this做事件参数相关问题解答 背景 在JavaScript中,我们经常会用到this关键字。尤其在事件处理函数中,this作为事件参数被广泛使用。但是,this在不同的情况下有不同的指向,在事件处理函数中可能会出现一些问题,本文将对这些问题进行解答。 this指向 在JavaScript中,this的指向是动态的,取…

    JavaScript 2023年6月11日
    00
  • Javascript Math exp() 方法

    JavaScript中的Math.exp()方法用于返回自然数e的x次幂,其中x是传递给该方法的参数。以下是关于Math.exp()方法的完整攻略,包括两个示例。 JavaScript Math对象的exp()方法 JavaScript Math对象中的exp()方法用于返回自然数e的x次幂,其中x是传递给该方法的参数。 下面是exp()方法的语法: Mat…

    JavaScript 2023年5月11日
    00
  • js只执行1次的函数示例

    当我们在编写JavaScript代码的时候,有时候我们需要保证某个函数只被执行一次。下面我会详细介绍两种方法来实现这个功能。 方法一:自执行函数 自执行函数(IIFE,立即执行函数表达式)是函数式编程中的一种技术,它可以让我们在声明函数时立即调用它一次,保证函数只被执行一次,并且函数内部的变量不会污染全局作用域。 以下是一个例子: (function() {…

    JavaScript 2023年6月11日
    00
  • arcgis js完整悬停效果实现demo

    悬停效果实现原理 在实现悬停效果之前,我们需要先了解一下悬停效果的原理。悬停效果可以通过两种方式来实现,即CSS方式和JavaScript方式。其中,CSS方式仅能实现简单的悬停效果,而JavaScript方式能实现复杂的个性化悬停效果。 在arcgis js中,我们使用JavaScript方式来实现悬停效果。具体实现步骤如下: (1)通过添加事件监听器(如…

    JavaScript 2023年6月11日
    00
  • Android 实现WebView点击图片查看大图列表及图片保存功能

    Android 实现WebView点击图片查看大图列表及图片保存功能 简介 在WebView中点击图片可以实现图片查看、图片保存等功能是非常常见且实用的功能,本文将详细介绍如何在Android中实现WebView点击图片查看大图列表及图片保存功能。 WebView中显示图片 在Android中使用WebView加载网页时,如果网页中有图片,则图片默认是不会展…

    JavaScript 2023年6月11日
    00
  • JavaScript DOM 添加事件

    JavaScript DOM 添加事件的完整攻略如下: 1. 确认要添加事件的HTML元素 在JavaScript中,我们首先需要确认要给哪个HTML元素添加事件。这个HTML元素可以是任何一个有效的DOM元素,比如一个按钮,一个输入框,一个复选框等等。我们可以使用DOM选择器(getElementById()、querySelector()等)去获取这个H…

    JavaScript 2023年6月10日
    00
  • JavaScript懒加载详解

    JavaScript懒加载是一种优化网站性能的技术,它可以在浏览器显示可见内容之后再延迟加载未显示内容,从而加快页面加载速度。下面将为你详细讲解JavaScript懒加载的完整攻略。 什么是JavaScript懒加载 JavaScript懒加载是指在页面加载时,将页面上的图片、视频、音频等资源暂时不加载,当用户滚动页面时再根据用户的可视范围加载相应的内容。这…

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