hasOwnProperty 方法解析

2023-09-20 16:58:25

一、含义:

hasOwnProperty 是 JavaScript 中的一个内置方法,用于检查对象是否具有指定名称的属性。

具体来说,hasOwnProperty 方法用于判断一个对象是否拥有某个指定的属性,而不是继承自原型链的属性。它是一个布尔值方法,如果对象拥有指定属性,则返回 true;否则,返回 false。 

例如,假设有一个对象 person

const person = {
  firstName: "John",
  lastName: "Doe",
};

console.log(person.hasOwnProperty("firstName")); // true
console.log(person.hasOwnProperty("age")); // false

在上面的例子中,person 对象拥有 firstName 属性,因此第一个 hasOwnProperty 调用返回 true。但是,它没有 age 属性,因此第二个 hasOwnProperty 调用返回 false

这个方法通常用于遍历对象的属性时,以确保你只获取对象本身的属性,而不是继承的属性。这在某些情况下非常有用,因为 JavaScript 对象可以具有原型链上的属性,而这些属性可能会影响你的代码行为。使用 hasOwnProperty 可以过滤掉继承的属性。

二、hasOwnProperty 与原型链

或许有同学会对“hasOwnProperty 与原型链”有疑惑,下面我详细解释一下:

原型链是 JavaScript 中的一种属性查找机制,当你尝试访问一个对象的属性时,如果对象本身没有这个属性,JavaScript 将继续查找对象的原型链,直到找到该属性或达到原型链的末尾(Object.prototype)。这意味着一个对象可以继承来自其原型链上的属性。

举个例子来说明 hasOwnProperty 的作用和原型链的概念:

function Person() {
  this.name = "John";
}

Person.prototype.age = 30;

const person = new Person();

console.log(person.hasOwnProperty("name")); // true,因为 "name" 是 person 对象自身的属性
console.log(person.hasOwnProperty("age")); // false,因为 "age" 是继承自原型链的属性

在上面的例子中,person 对象有一个自身的属性 "name",因此 hasOwnProperty("name") 返回 true。但是,它继承了原型链上的属性 "age",因此 hasOwnProperty("age") 返回 false,尽管 person 对象可以访问到 "age" 属性。

所以,hasOwnProperty 方法用于区分对象自身的属性和继承的属性,它在某些情况下非常有用,特别是当你想要检查对象的属性是否是由自身定义的时候。如果你只关心对象自身的属性,而不是继承的属性,hasOwnProperty 是一个非常有用的工具。

三、hasOwnProperty 常用场景

1.检查对象是否拥有特定属性:

const person = {
  name: 'Alice',
  age: 30,
};

if (person.hasOwnProperty('name')) {
  console.log('person 对象拥有 name 属性');
} else {
  console.log('person 对象没有 name 属性');
}

这个场景中,hasOwnProperty 用于检查 person 对象是否包含名为 'name' 的属性。如果包含,就会输出相应的消息。

2.遍历对象属性时的属性过滤:

在使用 for...in 循环遍历对象属性时,可以结合 hasOwnProperty 来过滤掉继承自原型链的属性,只获取对象自身的属性。

const person = {
  name: 'Alice',
  age: 30,
};

for (const key in person) {
  if (person.hasOwnProperty(key)) {
    console.log(`属性名: ${key}, 属性值: ${person[key]}`);
  }
}

这样可以确保只输出 person 对象自身的属性,而不包括从原型链继承的属性。

3.避免与对象原型属性的冲突:

在某些情况下,如果对象可能包含与其原型链中的属性同名的属性,使用 hasOwnProperty 可以帮助避免潜在的冲突。

Object.prototype.myMethod = function() {
  console.log('这是一个原型方法');
};

const obj = {
  myMethod: function() {
    console.log('这是一个对象属性方法');
  },
};

obj.myMethod(); // 调用对象属性方法

if (obj.hasOwnProperty('myMethod')) {
  obj.myMethod(); // 调用对象属性方法
}

在这个示例中,obj 对象包含一个名为 'myMethod' 的属性,但也继承了原型链上的 'myMethod' 方法。通过使用 hasOwnProperty 来检查是否存在该属性,可以确保调用的是对象自身的属性方法。

总之,hasOwnProperty 是用于检查对象自身属性的重要方法,可用于避免属性冲突、过滤属性以及确定对象是否包含特定的属性。但需要注意,它不会检查原型链上的属性,只会检查对象自身的属性。如果需要考虑原型链上的属性,可以使用其他方法,如 in 运算符或 Object.keys()

更多推荐

Linux硬链接、软链接

硬链接是一个目录条目(在基于目录的文件系统中),它将一个名称与一个文件关联起来。因此,每个文件必须至少有一个硬链接。为文件创建额外的硬链接可以使该文件的内容可以通过额外的路径访问(即通过不同的名称或在不同的目录中)这会导致别名效应(aliaseffect):进程可以通过任意路径打开文件并修改其内容。相比之下,文件的软链

【Verilog教程】2.5编译指令

以反引号`开始的某些标识符是Verilog系统编译指令。编译指令为Verilog代码的撰写、编译、调试等提供了极大的便利。下面介绍下完整的8种编译指令,其中前4种使用频率较高。define,undef在编译阶段,`define用于文本替换,类似于C语言中的#define。一旦`define指令被编译,其在整个编译过程中

ChatGPT可以取代搜索引擎吗?

ChatGPT对于一些简单的问题,可以完美的完成任务。但是我让它写一篇完整的文章,看看它能否代替我进行写作地的时候,我确定它不能完全取代人类。但是我们可以使用更多的指导来让AI在日常工作流程为我们工作,所以本文将讨论如何有效利用ChatGPT。这个想法是从简单的日常用例开始,然后进入更复杂的阶段。最后让我们看看Chat

三维模型3DTile格式轻量化压缩的遇到常见问题与处理方法分析

三维模型3DTile格式轻量化压缩的遇到常见问题与处理方法分析三维模型的轻量化压缩是一项技术挑战,特别是在处理复杂的3DTile格式时。下面列举了一些处理过程中可能遇到的常见问题以及相应的处理方法:模型精度损失:在进行压缩处理时,由于顶点减少或数据精度降低,可能导致模型的精度损失,表现为模型变形或者细节丢失。对此,我们

建设数字孪生智慧城市是未来城市的重要增长点

    中国国家创新与发展战略研究会学术委员会常务副主席、重庆市原市长黄奇帆在《瞭望》撰文指出:    AI时代的城市是由实体空间和数字空间组成的数字孪生城市,要充分重视对数字空间的治理。随着城市数字化进程的加快,城市、企业、个人开始形成多

山石网科国产化防火墙,打造全方位边界安全解决方案

互联网的快速发展促进了各行各业的信息化建设,但也随之带来了诸多网络安全风险。大部分组织机构采用统一互联网接入方案,互联网出口承担着内部用户访问互联网的统一出口和对外信息服务的入口,因此在该区域部署相匹配的安全防护手段必不可少。防火墙作为目前使用最为广泛的网络安全防护技术,它可以通过监测、限制、更改跨越防火墙的数据流,尽

SQL Server数据库中了360后缀勒索病毒怎么办,勒索病毒解密数据恢复

随着互联网的发展,网络安全问题日益凸显,勒索病毒已经成为当今数字威胁中的一大主要犯罪行为之一。其中,360后缀勒索病毒作为一种常见的数据库攻击形式,对数据库的安全性提出了极大挑战。近期我们收到很多企业的求助,企业的服务器数据库遭到了360后缀勒索病毒攻击,导致系统全部瘫痪无法正常工作,下面就为大家介绍一下如何应对及预防

Learn Prompt-Prompt 高级技巧:HuggingGPT

HuggingGPT是一个Agent框架,利用ChatGPT作为任务规划器,根据每个模型的描述来选择HuggingFace平台上可用的模型,最后根据模型的执行结果生成总结性的响应。这个项目目前已在Github上开源,并且有一个非常酷的名字叫做JARVIS(钢铁侠的助手)。这项研究主要涉及到两个主体,一个是众所周知的Ch

【LLM】解析pdf文档生成摘要 | 智能文档概览

文章目录一、整体思路二、代码三、小结与改进1.小结2.后续可继续优化的点四、智能文档Reference一、整体思路非常简单的一个v1版本利用langchain和pdfminer切分pdf文档为k块,设置overlap等参数先利用prompt1对每个chunk文本块进行摘要生成,然后利用prompt2对多个摘要进行连贯组

Qt Charts简介

文章目录一.图标类型Charts分类1.折线图和样条曲线图2.面积图和散点图3.条形图4.饼图5.误差棒图6.烛台图7.极坐标图二.坐标轴Axes类型分类三.图例四.图表的互动五.图表样式主题一.图标类型Charts分类图表是通过使用系列类的实例并将其添加到QChart或ChartView实例来创建的。Qt图表模块提供

Laravel框架 - IOC容器详解

IOC容器代码好了,说了这么多,下面要上一段容器的代码了.下面这段代码不是laravel的源码,而是来自一本书《laravel框架关键技术解析》.这段代码很好的还原了laravel的服务容器的核心思想.代码有点长,小伙伴们要耐心看.当然小伙伴完全可以试着运行一下这段代码,然后调试一下,这样会更有助于理解.<?php//

热文推荐