JavaScript 原型和原型链

news2024/11/29 8:54:59

文章目录

  • JavaScript 原型和原型链
    • 概述
    • new操作符的流程
    • 原型对象、构造函数、实例关系
    • 原型链
    • 原型链查找
      • hasOwnProperty
      • in

JavaScript 原型和原型链

概述

任何函数都有prototype属性,prototype是原型的意思。

prototype的属性值是个对象,它默认拥有constructor属性指回函数。

构造函数的prototype属性是它的实例的原型。

new操作符的流程

// 定义一个构造函数
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// 使用 new 操作符创建一个对象实例
var person1 = new Person("Tom", 23);
console.log(person1.name); // Tom
console.log(person1.age); // 23
  1. 函数体内会自动创建一个空对象。
  2. 该对象的原型指向构造函数的原型。
  3. 函数的上下文(this)会指向这个对象。
  4. 函数体内的语句会继续执行。
  5. 函数会自动返回上下文对象,即使函数没有return语句。

原型对象、构造函数、实例关系

每个构造函数在创建时都拥有一个prototype属性,prototype属性也就是指向函数的原型对象。在默认情况下,所有的原型对象都会增加一个constructor属性, 并指向prototype属性所在的函数,即构造函数。

通过new调用构造函数创建的实例,实例拥有一个__proto__属性,指向构造函数的原型对象,因此__proto__属性可以看作是一个连接实例与构造函数的原型对象的桥梁。

function Person(name, age) {
    this.name = name;
    this.age = age;
}

var p1 = new Person("小明", 18);
var p2 = new Person("小花", 28);

console.log(Person.prototype === p1.__proto__); //true
console.log(Person.prototype === p2.__proto__); //true
console.log(Person.prototype.constructor === Person); //true

说明:构造函数Person的prototype属性指向Person的原型对象,person1实例和person2实例的__proto__隐式属性指向Person的原型对象。

在这里插入图片描述

原型链

对象的每个实例都具有一个__proto__属性,指向的是构造函数的原型对象,而原型对象同样存在一个__proto__属性指向上一级构造函数的原型对象,就这样层层往上,直到最上层某个原型对象为null

在JavaScript中几乎所有的对象都具有__proto__属性,由__proto__属性连接而成的链路构成了JavaScript的原型链,原型链的顶端是Object.prototype,它的__proto__属性为null

function Person() {}
var p = new Person();

console.log(p.__proto__ === Person.prototype); //true
console.log(Person.prototype.__proto__ === Object.prototype); //true
console.log(Object.prototype.__proto__ === null); //true

在这里插入图片描述

原型链查找

当我们通过对象的实例读取某个属性时,是有一个搜索过程的。它会先在实例本身去找指定的属性,如果找到了,则直接返回该属性的值;如果没找到,则会继续沿着原型对象寻找;如果在原型对象中找到了该属性,则返回该属性的值。

function Person() {
    this.name = "小明";
}
Person.prototype.name = "小花";
var p = new Person();
console.log(p.name); //小明

hasOwnProperty

通过使用 hasOwnProperty 可以确定访问的属性是来自于实例还是原型对象。

var person = {
  name: 'Alice'
};
console.log(person.hasOwnProperty('name')); // true
console.log(person.hasOwnProperty('toString')); // false,toString是Object原型上的方法,不属于person对象自身

in

in操作符则是用来检查对象及其原型链上是否包含某个属性。

var person = {
  name: 'Alice'
};
console.log('name' in person); // true
console.log('toString' in person); // true,toString属于Object原型,被person继承

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/572512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java内存模型(Java Memory Mode,JMM)

并发编程模型的两个关键问题 线程之间如何通信及线程之间如何同步。 线程之间如何通信:共享内存,消息传递线程之间如何同步通信是指线程之间以何种机制来 交换信息同步是指程序中用于控制不同线程间 操作发生相对顺序 的机制在共享内存的并发模型里&a…

网络安全大厂面试题汇总

注:本套面试题,已整理成pdf文档,但内容还在持续更新中,因为无论如何都不可能覆盖所有的面试问题,更多的还是希望由点达面,查漏补缺。 ​ 某大厂一面整理 1、防范常见的 Web 攻击 2、重要协议分布层 3、ar…

c++使用yaml -基于windows10

参考:Windows10下使用VS2017编译和使用yaml-cpp库_雪域迷影的博客-CSDN博客 1. 下载yaml-cpp 建议在github下载其最新的官方版本,不要在其他平台下载该工具软件,下载地址如下(其中的一个版本): Release …

理解深度可分离卷积

1、常规卷积 常规卷积中,连接的上一层一般具有多个通道(这里假设为n个通道),因此在做卷积时,一个滤波器(filter)必须具有n个卷积核(kernel)来与之对应。一个滤波器完成一…

Android自定义键盘(KeyboardView)

目录 1.场景:2.想法:3.开始实现:《一》 在res包下创建xml目录,Keyboard标签来定义键盘布局:《二》创建IKeyboardView类并继承KeyboardView类,设置键盘布局(数字和字母)《三》 处理自定义键盘按键的点击事件…

C++11:列表初始化、新增关键字和新增的默认成员函数

目录 一. 列表初始化 1.1 {}列表初始化的方法 1.2 列表初始化实现的原理 二. C11新增关键字 2.1 decltype -- 自动类型推断 2.2 nullptr -- 空指针 2.3 default -- 强制生成默认成员函数 2.4 delete -- 禁止生成默认成员函数 2.5 final -- 禁止类被继承/禁止虚函数被重…

自动化测试之PageObject设计模式

译文如下: PageObject 当您针对网页编写测试时,您需要参考该网页中的元素以单击链接并确定显示的内容。但是,如果您编写直接操作 HTML 元素的测试用例,则您的测试将无法应对 UI 中的频繁修改。PageObject对应于一个HTML网页、页…

5月26号软件资讯更新合集......

Windows Terminal 1.18 新功能预览:标签拖拽、上下文菜单... Windows Terminal 预览版已更新到 1.18 版本,带来多项实用内容,一起来看看这个版本的新东西: 标签撕裂(拖拽功能) Windows Terminal 已支持对…

安装Redis6

安装Redis 安装redis依赖 redis是基于C语言编写的,因此首选需要安装redis所需的gcc依赖 yum install -y gcc tcl 上传安装包并解压 我安装的是redis-6.2.6版本,并且放到了/usr/local/src目录下 - 进入/usr/local/src目录shellcd /usr/local/src解压 tar …

全球最受欢迎低代码平台排行榜出炉

低代码平台正在成为寻求快速有效地构建应用程序的企业的首选解决方案。这些平台减少了编码要求,使企业能够在降低成本的同时更快地完成应用程序开发项目。在本文中,将探索全球受欢迎的低代码平台排行榜。 该排名使用的标准包括易用性、成本效益、集成性、…

很后悔,才发现这个API管理神器

想必大家都注意到了,近半年国产API管理工具火了起来。这说明两个问题,第一,API管理的重要性被越来越多的开发者认识到了,研发团队对API管理的需求也越来越强了。第二,说明国产软件真是越来越厉害了,大家确实…

《微服务实战》 第十八章 Redis查看配置文件和数据类型

前言 本章节讲解如何查看、修改Redis配置,介绍Redis类型。 1、查看配置 config get 配置名称 2、修改配置项 config set 配置项名称 配置项值 2.1、配置项说明 配置项参数说明daemonizeno/yes默认为 no,表示 Redis 不是以守护进程的方式运行&#xff…

论C站如何获得铁粉?过来人给出几点建议

哈喽,我是bug菌,一名想走👣出大山改变命运的程序猿。周五啦,刚肝完需求的我,闲暇之时逛C站热榜,偶然刷到一条看到官方抛出的话题:"在C站如何获得铁粉?",我寻思…

操作系统第五章——输入输出管理(上)

提示:初入红尘,不知人间疾苦,蓦然回首,已是苦中之人,这杯中酒三分,这酒中悲七分。关关难过关关过,夜夜难熬夜夜熬,愿这人世间所有爱恨情仇皆溶于酒,且将这红尘做酒&#…

MP4如何让去水印?python带你实现~

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 开发环境: 解释器版本: python 3.8 代码编辑器: pycharm 2021.2 模块使用: 内置模块(无需安装) os —> python系统编程的操作模块,提供了非常丰富的功能去处理文件和目录 sys —> 是与…

我是00后,我卷一点怎么了?

前段时间去面试了一个公司,成功拿到了offer,薪资也从12k涨到了18k,对于工作都还没两年的我来说,还是比较满意的,毕竟一些工作3、4年的可能还没我高。 我可能就是大家说的卷王,感觉自己年轻,所以…

手动创建django项目和python虚拟环境

在使用pycharm创建django项目的时候,报错如下: C:\Users\12051\AppData\Local\Temp\tmplkz609ucpycharm-management\setuptools-40.8.0\setup.py install Traceback (most recent call last):File "C:\Users\12051\AppData\Local\Temp\tmpqphl…

合并两个有序链表(java)

leetcode 21题:合并两个有序链表 题目描述解题思路:链表的其它题型。 题目描述 leetcode21题:合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入&…

IO多路转接

目录 一、select 1.1 select初识 1.2 select函数 1.3 scoket就绪条件 1.4 select基本工作流程 1.5 select服务器 1.6 select的优点 1.7 select的缺点 1.8 select的适用场景 二、poll 2.1 poll函数 2.2 poll服务器 2.3 poll的优点 && 缺点 三、epoll 3.1…

设备快线客户端软件V1.0用户手册

1.前言欢迎使用设备快线客户端软件产品。设备快线客户端软件简称DYClient,DYClient客户端是东用科技有限公司推出的一款用于远程维护的控制软件,主要为客户远程访问现场终端设备提供便捷的接入服务,并且通过DYClient客户端软件用户可以非常方便快捷的访问…