首页 > 其他分享 >【学习笔记】构造函数、原型对象、原型链

【学习笔记】构造函数、原型对象、原型链

时间:2024-07-25 14:58:05浏览次数:19  
标签:prototype name 对象 笔记 原型 构造函数 属性

  1. 在JavaScript中,每个对象都有一个原型对象,原型对象也是一个对象,它包含了对象的共享属性和方法。每个构造函数(除了箭头函数)都有一个prototype属性,该属性指向构造函数的原型对象。
  2. 当我们使用构造函数创建一个新对象时,该对象会继承构造函数的原型对象中的属性和方法,这种继承关系就构成了原型链。
  3. 构造函数通过原型对象实现了对象之间的共享属性和方法,构造函数的实例通过原型链继承了构造函数的原型对象的属性和方法。这种原型链的机制使得JavaScript中的对象可以实现一种灵活的继承和共享特性的方式。

构造函数

​ 构造函数调用的时候,必须通过一个 new 关键字来调用;我们一般不直接使用构造函数,而是使用构造函数创建出来的实例对象,构造函数是 js 面向对象的一个重要组成部分。

​ 使用构造函数就可以快速创建具有一些相似的属性和方法的对象,减少重复代码实现代码复用

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

const P1 = new Person('小a',18);
const P2 = new Person('小b',19);
const P3 = new Person('小c',20);

console.log(P1,P2,P3);
//Person {name: '小a', age: 18}
//Person {name: '小b', age: 19}
//Person {name: '小c', age: 20}

​ 除了 null 原型对象之外,任何对象都会在其 [[Prototype]] 上有一个 constructor 属性指向构造函数。使用字面量创建的对象也会有一个指向该对象构造函数类型的 constructor 属性,例如,数组字面量创建的 Array 对象和对象字面量创建的普通对象。

原型对象和原型链

function MyObject(city) {
    this.city=city;
    this.greet=function () {
        console.log(`Hello,${this.city}!`);
    }
}
var myobj=new MyObject("world");
myobj.greet(); // Hello,world!

这里有一个对象,它具有数据属性 city 和方法 greet(),如果你在控制台中输入对象的名称,然后跟随一个小数点(如同 myObject.),你会看到,除了 citygreet 外,还有很多其他属性!

请添加图片描述

访问其中一个:
myObject.toString(); // "[object Object]"
也可以在MyObject的原型上添加属性和方法
MyObject.prototype.name = `小明`
MyObject.prototype.sayHello = function() {
    console.log(`Hello,My name is ${this.name}`)
}
myobj.sayHello() // Hello,My name is 小明

每个构造函数都有一个 prototype 属性,即原型对象,通过实例对象的__proto__属性也可访问原型对象;而原型对象本质也是一个对象,是对象就有自己的原型对象,最终形成的链状的结构称为原型链。原型链终止于拥有 null 作为其原型的对象上。

当你试图访问一个对象的属性时:如果在对象本身中找不到该属性,就会在原型中搜索该属性。如果仍然找不到该属性,那么就搜索原型的原型,以此类推,直到找到该属性,或者到达链的末端,在这种情况下,返回 undefined

myObject 的原型是什么?可以使用 Object.getPrototypeOf() 函数查看

Object.getPrototypeOf(myObject); // Object { }

有个对象叫 Object.prototype,它是最基础的原型,所有对象默认都拥有它。Object.prototype 的原型是 null,所以它位于原型链的终点:

一个对象的原型并不总是 Object.prototype,如 Date 对象的原型是 Date.prototype 对象,Date.prototype 的原型是 Object.prototype

请添加图片描述

标签:prototype,name,对象,笔记,原型,构造函数,属性
From: https://blog.csdn.net/m0_59079084/article/details/140676087

相关文章

  • PostgreSQL学习笔记----GUC机制
    GUC介绍在守护进程Postmaster初始化内存环境之后,需要配置Postmaster运行时所需的各种参数。GUC(GrandUnifedConfiguralion)模块实现了多种数据类型(目前有boolean、int、real、string、enum五种)的变量配置。这些参数可能会由不同的进程在不同的时机进行配置,系统会根据......
  • 【学习笔记】倍增
    【学习笔记】倍增倍增法,顾名思义就是翻倍。它能够使线性的处理转化为对数级的处理,大大地优化时间复杂度。ST表RMQ是RangeMaximum/MinimumQuery的缩写,表示区间最大(最小)值。而ST表是用于解决可重复贡献问题的数据结构。记\(f(l,r)\)为\([l,r]\)这个区间的答案,可重......
  • 硬件开发笔记(二十八):TPS54331电源设计(一):5V电源供电原理图设计
    前言  电源供电电路设计很重要,为了更好的给对硬件设计有需求的人,特意将电源设计的基础过程描述出来。  本篇描述设计常用的12V转5V电路3A。 TPS54331(DC-DC稳压器)概述  TPS54331器件是一款28V、3A非同步降压转换器,集成有一个低RDS(on)的高侧MOSFET。为了提......
  • Tarjan(连通性相关) 笔记
    概念点(vertex)、边(edge)无向图中若图中存在两点可以到达,则称这两个点是连通的(connected)若图中任意两点都连通,则称该无向图为连通图(connectedgraph)若图\(G\)中存在一个连通子图\(H\)(\(H\subseteqG\)),没有严格更大的连通子图\(I\)使\(H\varsubsetneqqI\),则称\(H\)......
  • C++深拷贝构造函数解决浅拷贝的堆区内存重复释放问题
    1.简单介绍先简单介绍一下浅拷贝和深拷贝:浅拷贝->简单的赋值拷贝操作,默认的拷贝构造函数就是浅拷贝。深拷贝->在堆区重新申请空间,进行拷贝操作。2.问题展示下面用代码示例明了地展示默认拷贝构造函数浅拷贝带来地堆区内存重复释放问题:#include<iostream>usingnamespace......
  • JVM个人详细笔记总结
    jvm概念和运行过程jvm是java的虚拟机位于操作系统层之上,应用程序层之下,所以才具有跨平台能力,JAVA文件需要通过JVM转译成字节码或通过javac命令编译为.class文件后才能运行JAVA程序,运行时必须要有JRE(运行环境),JDK是开发包,其中包含有JRE。jvm组成JVM结构主要分为三个部分:类......
  • C++自学笔记15(数组)
    指针是C++中数组的工作方式,没有指针基础可以看笔记6。数组就是一堆变量的集合,有没有感觉与结构体很相似?让我们来考虑下在结构体中我们仅仅是定义了几个变量例如定义x,y坐标与speed速度。如果我们需要64个变量表示某个东西的64种状态,那么你会看到inta0=0;inta1=1;inta2......
  • C++自学笔记16(字符串与字符串字面量)
    当我们想在电脑上以文本方式表示东西时,一个单词、一个句子、一大段文章都叫做字符串。字符串就是为了我们去处理文字文本的方法。字符串实际上就是字符组成的数组或指针(数组就是指针的一种)。(有人会问数组不是储存数字么?怎么储存字符?因为ASCLL码表将所有字母、数字、符号翻译......
  • 【笔记】矩阵的行列式
    定义行列式(Determinant)是对\(n\)阶方阵\(A\)定义的,是一个标量。\(A\)的\(n\)阶行列式\(\operatorname{det}(A)\)或\(|A|\)定义如下:\[\operatorname{det}(A)=\sum_p(-1)^{\operatorname{sgn}(p)}\prod_{i}A[i][p_i]\]这里将排列的奇偶性定义为了\(\operatorname{sgn......
  • C++学习笔记(03)——通讯录管理系统设计
    记录一下利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人显示联系人:显示通讯录中所有联系人信息删除联系人:按照姓名进行删除指定联系人查找联系人:按照姓名查看指定联系人......