首页 > 其他分享 >对原型链的理解

对原型链的理解

时间:2022-08-22 09:57:27浏览次数:92  
标签:对象 查找 理解 原型 hasOwnProperty prototype 属性

目录

原型链

  1. 原型对象

在 JavaScript 中,绝大多数的函数都有一个叫做 prototype 的属性,指向原型对象,
通过构造函数new出来的实例, 都可以共享访问原型对象的属性。

image

  1. 原型链

在JavaScript 中所有都是对象,每个对象都有一个 __proto__ 属性,这个属性指向了当前对象的构造函数的原型。对象可以通过自身的 __proto__属性访问构造函数的原型对象,原型对象也有 __proto__,访问原型的原型,向上查找,直到找到Object.prototype,因此这样就串联形成一个链式结构,也就是我们称为的原型链

  1. 属性的区分

通过 hasOwnProperty()函数来实现

let person = { 
  name: "Tom", 
  age: 18, 
  job: "student"
}

console.log(person.hasOwnProperty("name")) // true 
console.log(person.hasOwnProperty("hasOwnProperty")) // false 
console.log(Object.prototype.hasOwnProperty("hasOwnProperty")) // true

name属性为实例属性,在调用hasOwnProperty方法时,会返回truehasOwnProperty属性为原型对象上的属性,在调用hasOwnProperty函数时,会返回false.

在使用for...in运算符,遍历对象的属性时,一般可以配合hasOwnProperty方法一起使用,检测某个属性是否为对象自身的属性,如果是,可以做相应的处理。

for(var p in person){
    if(person.hasOwnProperty(p)){
        
    }
}
  1. 原型链特点

第一个特点:由于原型链的存在,属性查找的过程不再只是查找自身的原型对象,而是会沿着整个原型链一直向上,直到追溯到Object.prototype.也就是说,当js引擎在查找对象的属性时,先查找对象本身是否存在该属性,如果不存在,会在原型链上查找,直到Object.prototype.如果Object.prototype上也找不到该属性,则返回undefined,如果期间在对象本身找到了或者是某个原型对象上找到了该属性,则会返回对应的结果。

由于这个特点,我们在自定义的对象中,可以调用某些未在自定义构造函数中定义的函数,例如toString( )函数。

function Person(){ }
var p = new Person();
p.toString(); // 实际上调用的是Object.prototype.toString( )

第二个特点:由于属性查找会经历整个原型链,因此查找的链路越长,对性能的影响越大。

标签:对象,查找,理解,原型,hasOwnProperty,prototype,属性
From: https://www.cnblogs.com/xiayuxue/p/16611818.html

相关文章

  • vue中的EL理解
    el的作用:用于指明Vue实例的挂载目标。那么什么是挂载?虚拟dom与真实dom建立关系,让Vue实例控制页面中的某个区域的过程,称之为挂载。挂载的方式有:1、通过“el:'css选择器......
  • 2022.8.21 各种锁理解
    21、各种锁理解1、公平锁和非公平锁:公平锁:非常公平,不能够插队,必须先来后到!FIFO非公平锁:非常不公平,可以插队(默认都是非公平)2、可重入锁递归锁  可重入锁sync......
  • 打碎自己,理解自己,重塑自己
    我不得不去打碎自己,对着掉落的碎片一点一点地去发现身上的问题,然后一块块地去解决,或者去接受,要么改正自己的缺点,要么接受自己的缺点。关于爱情。ztt为什么拉黑你。......
  • 我对EE学科知识体系的一点理解
    前言研究生一年级的分都出完了,鉴于学分已经修够了,可以说学生时期上课、写作业、考试的日子也基本上到头了。有幸高中升大学时挑选了一个自己感兴趣的专业(电子信息工程),学......
  • 【Java面试】并发编程高频面试题,请你说一下你对Happens-Before的理解
    “请你说一下你对Happens-Before的理解”你听到这个问题的时候,知道怎么回答吗?大家好,我是Mic,一个工作了14年的Java程序员。并发编程是面试过程中重点考察的方向,能够考察......
  • 对于stosd的理解
    在TSS相关的代码中,发现通常会有这样一段:movedi,[app_i_param]addedi,[app_mem_pos]movecx,256/4cldreps......
  • RabbitMQ 入门系列:2、基础含义理解:链接、通道、队列、交换机
    系列目录RabbitMQ入门系列:1、MQ的应用场景的选择与RabbitMQ安装。RabbitMQ入门系列:2、基础含义:链接、通道、队列、交换机。RabbitMQ入门系列:3、基础含义:持久化、......
  • springMvc40-restful的crud的项目原型介绍
    上图·是目录结构,本节是有问同学的,当好好总结pom.xml   <projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan......
  • 原型对象
    1什么是原型对象1.1从一段代码开始认识显式原型对象functionFU(){}console.log(FU.prototype)在上面代码中,定义了一个叫做FU的函数然后我们打印了这个......
  • 11原型与继承
    1<!doctypehtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"6content="width=device-width,us......