学习前端第三十五天(原型继承,F.prototype,原生的原型)

一、原型继承

1、[ [ Prototype ] ],对象属性

 所有对象都有一个[ [ Prototype ] ]

当从object中读取一个缺失的属性时,JavaScript 会自动从原型中获取该属性,“原型继承”。

其中之一设置原型的方法,使用特殊的名字 __proto__

        const one = {name: "jack",sayHi() {console.log("Hi")}}const two = {// name: 'xc'};two.__proto__ = one;  // 原型继承,two继承one的属性console.log(two.name);  // one的nametwo.sayHi();

 one中的属性和方法在two中可读取和使用

2、原型链

        const one = {name: "jack",sayHi() {console.log("Hi")}}const two = {// name: 'xc'__proto__: one, // 原型继承,two继承one的属性};// 原型链,自下往上寻找内容// 原型继承不能形成闭环;__proto__:只能继承对象和nullconst three = {__proto__: two,}const four = {__proto__: three,}console.log(four.name); // jackfour.sayHi(); // Hi

four中没有,会再从three中招,然后是two,one,找到为止

但是:1.继承不能产生闭环;2.继承的只能是对象和null

3、写入不使用原型 ,修改属性不会对原型产生任何影响

原型仅用于读取属性。对于写入/删除操作可以直接在对象上进行。

        const one = {name: "jack",};const two = {__proto__: one,};const three = {__proto__: two,};three.name = "xxx";// one中的“name”没受到影响console.log(three);  // {name: 'xxx'}console.log(one);  // {name: 'jack', sayHi: ƒ}

访问器(get / set)是例外 ,设置与访问器有关的属性时,会调用原型中的访问器

        const one = {firstName: "xu",lastName: "chuang",get fullName() {return `${this.firstName} ${this.lastName}`;},set fullName(value) {[this.firstName, this.lastName] = value.split(" ");},};const two = {firstName: "zhang",lastName: "li",__proto__: one,};console.log(two.fullName); // zhang li// 第一次查找:在two中未找到fullName,在one中找到fullName方法;// 第二次查找:在two中找到firstName和lastName,执行该方法two.fullName = "xu li"; // 原型one中的set被调用了console.log(two);  // {firstName: 'xu', lastName: 'li'}

4、原型继承时this的值 

无论在哪里找到方法:在一个对象还是在原型中。在一个方法调用中,this 始终是点符号 . 前面的对象。

        const obj1 = {name: "xc",say() {console.log(this.name)}}const obj2 = {name: "xl",__proto__: obj1,}const obj3 = {name: "xyp",__proto__: obj2,}// 无论在哪里找到方法:在一个对象还是在原型中。在一个方法调用中,this 始终是点符号 . 前面的对象。obj1.say(); // xcobj2.say(); // xlobj3.say(); // xyp

5、for...in 循环会迭代继承的属性

想排除继承的属性:

obj.hasOwnProperty(key):如果 obj 具有自己的(非继承的)名为 key 的属性,则返回 true

        const obj1 = {name: 'xc',age: 20,gender: "male"};const obj2 = {name: "xl",__proto__: obj1,};for (let i in obj2) {if (obj2.hasOwnProperty(i)) console.log(obj2[i]);// 没有判断:xl 20 male ; 有if判断:xl}

二、F.prototype

1、构造函数创造对象时设置原型

new F() 构造函数创建一个新对象。如果 F.prototype 是一个对象,那么 new 操作符会使用它为新对象设置 [[Prototype]]

F.prototype 指的是 F 的一个名为 "prototype" 的常规属性。这听起来与“原型”这个术语很类似,但这里实际上指的是具有该名字的常规属性。可以任意设置F的“prototype”。

        // 构造函数(实例)对象指向构造函数的原型function Fn() {// this={}// ! this.__proto__=Person.prototype// return this};const fn = new Fn()console.dir(Fn);console.log(fn);console.dir(Fn.prototype == fn.__proto__)

2、默认的F.prototype

每个函数都有 "prototype" 属性。默认的 "prototype" 是一个只有属性 constructor 的对象,属性 constructor 指向函数自身。constructor 属性可以通过 [[Prototype]] 给所有 构造函数对象 使用。

        function Fn() {// this={}// ! this.__proto__=Person.prototype// return this};const fn = new Fn()console.dir(Fn);console.log(fn);console.log(Fn === Fn.prototype.constructor); // trueconsole.log(Fn === fn.constructor); // trueconsole.log(Fn.prototype.constructor === fn.constructor); // true

三、原生的原型

1、Object.prototype

 所有对象的原型链的终点:Object;

Object的原型是null。

        // 原生的原型/* function Object() {this = {}this.__proto__ = Object.prototype  return this} *///  const obj1= new Object()const obj1 = {};console.log(obj1.__proto__ === Object.prototype);console.log(Object.prototype.__proto__ ); // null 原生

2、其他内建原型

其他内建对象,像 ArrayDateFunction 及其他,在prototype中都自带了各种方法。

当我们创建一个数组 [1, 2, 3],在内部会默认使用 new Array() 构造器。 Array.prototype 变成了这个数组的 prototype,并为这个数组提供数组的操作方法。

 3、更改原生原型(不推荐使用)

        // 原生原型的方法所有都能用

        Array.prototype.say = function () {

            console.log("hello");

        }

        const arr = [];

        arr.say();

四、原型方法,没有__proto__的对象

1、原型方法

Object.create(proto,{??}) 创造一个对象,以proto为原型,以及可选的属性描述来创建一个空对象;

Object.getPrototypeof(obj)返回对象obj的[ [ Prototype ] ];

Object.setPrototypeof(obj,proto)设置对象obj的原型为proto;

Object.create 方法更强大,因为它有一个可选的第二参数:属性描述器。

我们可以在此处为新对象提供额外的属性,就像这样:

        const Person = { name: "jack" };const obj = Object.create(Person, {age: {value: 20},gender: {value: "boy"}});console.log(obj);

实现对对象Person的完全复制: 

      let clone = Object.create(Object.getPrototypeOf(Person),Object.getOwnPropertyDescriptors(Person),)

2、没有__proto__的对象

        // 极简对象“Very plain” object,原型为null

        const obj = { a: 1, b: 2 }

        Object.setPrototypeOf(obj, null);

        console.log(obj); // {a: 1, b: 2} , 没有原型

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

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

相关文章

JavaScript 对象入门:基础用法全解析

目录 对象 语法 属性和访问 方法和调用 this关键字 null 遍历对象 内置对象 Math 属性 方法 Date 创建日期对象 获取和设置日期 ⭐对象 对象是 JavaScript 数据类型的一种,数据类型也包括数值类型、字符串类型、布尔类型、undefined。对象数据类型可…

mcu 常用宏定义展示

简介 MCU开发中一般有很多地方需要对寄存器进行操作。 寄存器操作 #define SET_BIT(REG, BIT) ((REG) | (BIT))#define CLEAR_BIT(REG, BIT) ((REG) & ~(BIT))#define READ_BIT(REG, BIT) ((REG) & (BIT))#define CLEAR_REG(REG) ((REG) (0x0))#de…

程序员之路:裁员与内卷下的生存之道

作为一名普通的程序员,身处这个瞬息万变的IT行业,面对着今年不断加剧的裁员浪潮和日益激烈的内卷竞争,我时常感到焦虑和不安。然而,正是这些挑战,让我们更加深入地思考了在这个行业中,我们该如何找到自己的…

wireshark_http

过滤器: 捕获过滤器:表达式作用在wireshark开始捕获数据包之前,只捕获符合条件的数据包,不记录不符合条件的数据包。 显示过滤器:表达式作用在在wireshark捕获数据包之后,从已捕获的所有数据包中显示出符…

[链表专题]力扣21, 234

1. 力扣21 : 合并两个有序链表 题 : 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1:输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2:输入:l…

2024统计建模中国新质生产力统计测度与时空演变及其驱动因素研究

高质量成品论文46页word版本1.5w字书写完整数据集1000行py代码一等奖论文!这里仅展示部分内容,完整版在下面的链接。 【1.5w字全网最佳】2024统计建模大赛高质量成品论文39页配套完整代码运行全套数据集https://www.jdmm.cc/file/2710661/ 中国新质生产…

【2024HNCTF】密码组部分出题记录

2024H&NCTF 密码组部分出题记录 题目:BabyPQ、HappyDance 文章目录 2024H&NCTF 密码组部分出题记录BabyPQ | 签到HappyDance BabyPQ | 签到 本题为nc交互题,之所以采用这种形式,是因为可能有很多密码新师傅们不了解这种赛题形式&a…

AI机器人火了,探讨早就可以帮我们开拓市场的中关村科金语音机器人

近期AI机器人给我们带来了不少惊喜,比如国外 Figuer 联合 OpenAI 做了 Chatgpt 机器人,可以通过对话后推理干活,国内仿生机器人员工也开始量产,看到AI机器人不禁想到会不会替代我们的工作?我们了解到很多机器人厂家的…

#初阶模板

目录 1.泛型编程 2.模板 (1)函数模板 (2)举个栗子(模板的使用) 1.模板的声明有两种形式 2.函数模板的原理 (3)模板参数的匹配原则 (4)类模板 类模板…

AI图像生成-原理

一、图像生成流程总结 【AI绘画】深入理解Stable Diffusion!站内首个深入教程,30分钟从原理到模型训练 买不到的课程_哔哩哔哩_bilibili 二、如果只是用comfy UI生成图片 1、找到下面几个文件,把对应模型移动到对应文件夹即可使用 2、选择对…

大学c语言基础很差,能不能学51单片机?会不会很困难?

开始前我分享下我的经历,我刚入行时遇到一个好公司和师父,给了我机会,一年时间从3k薪资涨到18k的, 我师父给了一些51单片机学习方法和资料,让我不断提升自己,感谢帮助过我的人, 如大家和我一样…

python turtle 升国旗

​一、导语 大家好,前段时间,我们画出了五星红旗,今天我们要用Python的Turtle库来绘制一个五星红旗,并让国旗上升,让我们一起来感受编程与艺术的完美结合吧!领略国家的强大!爱祖国,做一个遵纪守法的好公民。 二、效果展示 升国旗 三、开发过程 一、准备工作 首先我们…

OpenAI深夜震撼发布最新模型GPT-4o,送上最快速便捷教程

北京时间5月14日凌晨,有人说OpenAI一夜改变了历史。 在我们的深夜、太平洋时间的上午 10 点,OpenAI 召开春季发布会,公布了最新的GPT-4o模型,o代表Omnimodel(全能模型)。20多分钟的演示直播,展…

美国加州正测试ChatGPT等生成式AI,在4大部门应用

5月11日,美联社消息,美国加州政府正在测试ChatGPT等生成式AI,应用在税收和收费管理部、交通部、公共卫生部以及卫生与公众服务部4大部门。 测试时间6个月,为其提供技术支持的一共有5家公司,分别是OpenAI、Anthropic、…

成都新增数字产业园,打造生态经济新引擎

成都产业园运营方树莓集团——数字产业生态链建设者。秉持高效、友善、敢为的集团核心文化,有效链接政、产、企、校四个板块,构建了产业生态闭环系统。在成都市区内,已布局了多家数字文创产业园,其中具有代表性的参考国际数字影像…

Linux 第三十一章

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

GRFB-UNet:一种新的多尺度注意力网络,用于铺路分割

不同场景下的带注释的触觉铺装示例: GRFB-UNet网络结构: GRFB模块的结构: 铺路在视障人士的旅行中起着至关重要的作用。因此,识别铺装的形状和位置以支持视障人士的移动性是相当有意义的,而视觉分割技术就适合这项任务。为了有效提高触觉铺装分割的精度和鲁棒性,…

httpsok-v1.11.0支持CDN证书自动部署

🔥httpsok-v1.11.0支持CDN证书自动部署 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具,专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分钟轻松搞定SSL证书自动续期 v1.11.0 版…

从“山寨的”MTK芯片发展历程 同类芯片比较基础常识 如何简单识别mtk机型

联发科技(MediaTek Inc.简称“联发科” ,联发科起家于CD-ROM芯片,直接将DVD内分别承担视频和数字解码功能的两颗芯片整合到了一颗芯片上,并提供相应的软件方案。并一度占据大陆DVD市场60%的芯片供应量!他将图像处理、M…

证卡打印机打印头故障的主要原因以及如何预防

爱立识打印头故障的主要原因主要包括以下几点: Evolis 打印机清洁卡 灰尘或碎屑堆积:长时间不清洁打印机导致灰尘或碎屑在机器内积累,可能会导致打印头划伤或堵塞。 使用不洁的卡片:使用不洁的卡片可能会导致灰尘或污垢进入打印机…