JavaScript 3.3 继承与原型链

js对象高级:08、详解3种继承模式(原型链继承、借用构造函数继承、组合继承) JavaScript继承的三种模式:原型链继承通过将子类原型指向父类实例实现继承,但会导致constructor指向问题;借用构造函数继承在子类中通过call()调用父类构造函数,只能继承属性无法继承方法;组合继承结合两者优点,利用原型链继承方法,借用构造函数继承属性。每种方式各有特点,原型链继承简单但有缺陷,组合继承是较优解决方案。实际开发中应根据需求选择合适的继承方式,理解原型链机制是关键。 阅读详情

参考文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

一、JavaScript 只有一种结构:对象。每个实例对象( object )都有一个私有属性(称之为 __proto__ )指向它的构造函数的原型对象(prototype )。

该原型对象也有一个自己的原型对象( __proto__ ) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。几乎所有 JavaScript 中的对象都是位于原型链顶端的Object 的实例。

二、JavaScript 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的

原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。

示例 1

let f = function () {
   this.a = 1;
   this.b = 2;
}
console.log(f instanceof Function)//true
console.log(f.__proto__ ===Function.prototype)//true
let o = new f();
o是调用构造方法f,生成的实例

console.log(o instanceof f)//true
console.log(o.constructor ===f) // true

f.prototype.b = 3;
f.prototype.c = 4;
不要在 f 函数的原型上直接定义 f.prototype = {b:3,c:4};这样会直接打破原型链
console.log(o.a);
output:1  ,o的自身属性,值为1
console.log(o.b);
output:2  ,o的自身属性值为2,原型上的b会因为同名被遮蔽,成为属性遮蔽
console.log(o.c);
output:4  ,c并不是o的自身属性,当自身没有该属性时,就会往上一层的原型对象上找,
console.log(o.d);
outputundefind ,d不是o的自身属性,上层原型也没有,所以最后输出undefined

整个原型链如下
{a:1, b:2} ---> {b:3, c:4} ---> Object.prototype---> null


f其实Function对象的实例,所以f有__proto__私有属性指向其构造函数的原型对象
console.log(f.__proto__ ===Function.prototype)//true

同时,f又是一个函数,所以f也有prototype的属性
o.__proto__===f.prototype  //true
实例o的__proto__指向f的prototype原型对象,f.prototype在这里应该当成f的原型
对象,而不应该当成f的prototype属性,尽管他们的值是一样的

 示例2

var o = {a: 1};
var a = ["yo", "whadup", "?"]
var f = function f(){
  return 2;
}

o的原型链o ---> Object.prototype ---> null
a的原型链a ---> Array.prototype ---> Object.prototype ---> null
f的原型链f ---> Function.prototype ---> Object.prototype ---> null

一个对象实例的__proto__指向了其原型对象,其原型对象的__proto__会一直向
上,Object.prototype.__proto__是null,这个实例会继承原型链中的方法

如 o指向了Object.prototype,那么o就有了Object.prototype中的方法

o.hasOwnProperty("a")//true,该方法只会查询实例自身,并不会遍历整个原型链

示例3 继承

"use strict";

class Animal{
    static belong= "china";
    flag = true;
    constructor(age,name){      
        this.age = age;
        this.name = name;
}
     eat(){
            console.log(this.age + "岁的"+ this.name + "会吃食");
}
static run(){console.log(this.name +"会跑")}
}


var o = new Animal(1,"猫");
o.sound = function sound(){console.log(this.name + "的叫声是喵喵")}

Animal.prototype.swim = function swim (){return this.name + "不会游泳"};
var x = new Animal(1,"鸡");

1、static修饰的变量或者方法,不属于实例,而是属于对象的构造函数的

o.constructor.run() === Animal.run() //true

2、没被static修饰的变量是会被实例继承的,如flag

o.hasOwnProperty("flag") === x.hasOwnProperty("flag")//true

3、没被static修饰的方法是属于Animal.prototype原型对象的,如eat


var y = Object.create(o);
以o的原型对象创建一个实例,实例y没有任何私有属性,o的私有属性及方法,以及继承来的
flag属性,都将作为y.__proto__的原型对象的方法和属性



class  Bird extends Animal{

     constructor(age ,name){
        super(age,name)

}
    get allParm(){return this.name + this.age}


    set parm(newname){
        
            this.name = newname

}
}

var a = new Bird(1,"小鸟");
Bird.prototype.bird = "飞";

1、a是Bird对象的实例,它指向的原型对象是Bird
a.__proto__===Bird.prototype //true

2、Bird对象中的get 和 set 都是属于Bird.prototype原型对象中的属性

3、Bird实例会继承Animal中非static修饰的变量
a.hasOwnProperty("flag") //true

示例4 protype与getPrototypeOf

var o = new Foo();
JavaScript 实际上执行的是:

var o = new Object();
o.__proto__ = Foo.prototype;
Foo.call(o);

o.someProp;
它检查 o 是否具有 someProp 属性。如果没有,它会查找 
Object.getPrototypeOf(o).someProp,如果仍旧没有,它会继续查找
Object.getPrototypeOf(Object.getPrototypeOf(o)).someProp。
最后null没有原型对象,所以会返回undefined

Object.getPrototypeOf(o) === o.__proto__//true

详解电路设计中的RC电路 ​ 一、什么是RC电路 RC电路是指由电阻R和电容C组成的电路,它是脉冲产生和整形电路中常用到 的电路。 常见的RC充、放电电路、RC积分电路合RC微分电路接下来详细讲解。 二、RC充、放电电路 RC充、放电电路如下图所示,下面通过充电和放电两个过程来分析此电路。 ​RC充、放电电路图 (1)RC充电电路 RC充电电路图如下图(a)所示 RC充电电路图及充电曲线图 ​由上图分析: 将上图a中开关S置于“1”处,电源E开始通过电阻R对电容C充电,由于刚开始充电时电容两端没有.. 阅读详情

相关推荐

Frida+Objection保姆级教程:从环境搭建到实战Hook(含Wallbreaker插件使用)

本文提供了一份从零开始的Frida与Objection移动安全动态分析实战指南。详细讲解了Python环境配置、Frida-Server部署、Objection核心命令使用以及Wallbreaker插件安装与应用。通过实战案例演示如何Hook网络请求(如HttpURLConnection和OkHttp3),帮助安全研究人员快速掌握应用运行时行为分析与漏洞挖掘技能。

weixin_28318011的博客 99

面向对象

封装 封装函数,写入参数,然后return出去 构造函数,内部使用this变量,通过使用new运算符生成实例,实例对象的constructor属性指向他们的构造函数 prototype,把那些不变的属性和方法直接定义在prototype对象上,每一个构造函数都有一个prototype属性,指向另外一个对象,这个对象的所有属性和方法都会被构造函数的实例所继承。 i...

TTTT2015的博客 165

Multisim的探针(Probe)及数字电路的一些调试技巧的应用

Multisim的探针(Probe)及数字电路的一些调试技巧的应用 --EE Bang   By  WRS 上图为555方波发生器,根据R1,R2,C2参数的配置可产生频率为46.3KHZ,占空比50%的方波信号,如果用示波器查看波形参数的话需要用两个坐标轴做差,操作不便,另外如果要修改电路将上述电阻换成滑动变阻器的话,使其产生可变频率

Agent Christmas的博客 3万+

JAVA中构造方法、实例方法(无static/非静态)、类方法(static/静态)的区别

静态方法同类调用:静态方法直接调用静态方法,静态方法需要new才能调用非静态方法 静态方法不同类调用:静态方法通过类名.静态方法调用,静态方法通过new调用非静态方法 非静态方法同类调用:非静态方法直接可以调用静态和非静态方法 非静态方法不同类调用:非静态方法调用静态方法,通过类名.静态方法调用;非静态方法调用非静态方法:通过new对象,再对象.非静态方法调用 JAVA中构造方法、实例方法、类方法的区别 1. 构造方法 构造方法负责对象的初始化工作,为实例变量赋予合适的初始值。必须...

Java后端技术栈 1364

Win11 C盘爆满别慌!手把手教你安全迁移AppData和用户文件夹(附一键脚本)

本文针对Win11 C盘空间不足问题,提供了一套安全有效的解决方案。通过深入解析用户目录结构,指导用户利用符号链接和Robocopy工具,将AppData、下载文档等占用大户迁移至其他分区,并附带了自动化脚本,从根本上实现C盘瘦身,同时确保系统稳定和数据安全。

weixin_29231221的博客 2084

中兴畅行60 ZTE 7552N 深度改造指南:从解锁BL到Magisk Root与IMEI硬改全流程

本文详细介绍了中兴畅行60(ZTE 7552N)的深度改造全流程,包括解锁BL、刷入Magisk获取Root权限以及IMEI硬改等关键步骤。通过专业的操作指南和实用技巧,帮助用户安全完成设备改造,同时提醒注意法律风险和技术难点。

weixin_33670786的博客 1882

JavaScript 3.3变量

(ECMAScript的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据) //定义变量时要使用var操作符(注意var是一个关键字),后跟变量名(即一个标识符) // var message; // 用var操作符定义的变量将成为定义该变量的作用域中的局部变量。 // 如果在函数中使用var定义一个变量,那么这个变量在函数退出后就会被销毁 function test() { var carName = 'aa'; console.log(carName); .

xuekatie的博客 156

基于STM32环境温湿度监测系统设计

基于STM32环境温湿度监测系统设计1. 实验目的2. 任务和要求3. proteus仿真图4. 实验代码 1. 实验目的 (1) 掌握使用 KEIL MDK5 进行软件开发的具体流程; (2) 掌握硬件电路的设计方法; (3) 掌握 STM32 微控制器的程序设计及代码编写方法。 2. 任务和要求 (1)在 STM32F103 平台下,通过温度传感器 DS18B20 和湿度传感器 DHT11 实现环境温湿度信息的采集; (2)将温度传感器和湿度传感器所采集的数据在 LCD 液晶屏幕上显示出来,超

唯一的博客 2万+

JavaScript原型链以及ES3、ES5、ES6实现继承的不同方式

本文首发于GitHub,《JavaScript原型链以及ES3、ES5、ES6实现继承的不同方式》,欢迎关注我的GitHub。原型执行代码var o = new Object();,此时o对象内部会存储一个指针,这个指针指向了Object.prototype,当执行o.toString()等方法(或访问其他属性)时,o会首先查看自身有没有该方法或属性,如果没有的话就沿着内部存储的指针找到Object

孙群 8259

六轴机器人正解

采用的是John H.Craig在【机器人学导论】中的改进DH模型 1.六轴坐标系 2.DH参数 i αi−1\alpha_{i-1}αi−1​ ai−1a_{i-1}ai−1​ did_idi​ θi\theta_iθi​初值 1 0 0 0 0 2 -90 a1a_1a1​ 0 -90 3 0 a2a_2a2​ 0 -90 4 -90 a3a_3a3​ d4d...

m0_37581770的博客 2511

【数据集8】全球人口数据WorldPop详解

全球人口数据WorldPop详解

WW、forever的博客 7877

3、JS原型继承传参及原型链

原型 prototype 添加原型属性 __proto__ 用于修改和获取 原型 属性 __proto__和prototype的区别 //原型 function Person(){ } Person.prototype.name = 'Tina' Person.prototype.age = 26 Person.prototype.action = function(){ return th...

weixin_42549581的博客 638

点云配准SIFT+SI+RANSAC+ICP

Spin Image(SI)是一种用于点云数据描述的特征描述子,广泛应用于三维点云配准、识别和重建等领域。它能够捕捉点云中的局部几何信息,具有旋转不变性和部分平移不变性等优点,是一种非常强大的特征描述子。Spin Image是一种强大的点云特征描述子,具有旋转不变性、局部几何信息捕捉等优点,适用于点云配准、目标识别和三维重建等多个领域。通过合理选择局部区域、建立参考框架和计算描述子,可以充分利用Spin Image描述点云的特征,从而实现各种三维场景分析和处理任务。

点云兔子的博客 557

JavaScript 进阶教程(3)---让你彻底搞懂原型链和继承

1 原型链 1.1 原型 关于原型在JS面向对象编程这篇文章已经讲过了,今天简单来复习一下。 1.1.1 什么是原型? 在JS构造函数中有一个属性prototype,叫做原型,这是给程序员使用的。在JS实例对象中有一个属性__proto__,它也是原型,这是供浏览器使用的,它不是标准的属性。 实例对象中的__proto__指向的是该实例对象中的构造函数中的prototype,构造函数中的prototype里面的属性或者方法,可以直接通过实例对象调用。 一般情况下,实例对象.__proto__才

AlbertYang的博客 2万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

聚焦 “原型链与继承”

道:原型链是 JS 的底层机制,是 “对象复用” 的核心,ES6 class 只是其语法糖;术日常开发用 class + extends 写继承(简洁高效);看懂框架源码时,要能识别寄生组合继承、混入继承的本质;避坑关键:分清 __proto__ 与 prototype,理解原型链查找规则;终极认知:JS 中 “一切皆对象”,而对象的 “遗传关系” 由原型链定义 —— 掌握原型链,才能真正理解 JS 的面向对象设计思想,看懂 Vue、React 等框架的底层实现。

qq_40617614的博客 839

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JavaScript-原型链和继承-3

function Son() { this.name = 'a'; this.names = ['a']; } var son1 = new Son(); son1.name = 'b'; son1.names.push('b'); var son2 = new Son(); console.log(son2.name); //a console.log(son2.names);...

qq_34153210的博客 263

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

玩转JavaScript OOP[3]——彻底理解继承和原型链

概述 上一篇我们介绍了通过构造函数和原型可以实现JavaScript中的“类”,由于构造函数和函数的原型都是对象,所以JavaScript的“类”本质上也是对象。这一篇我们将介绍JavaScript中的一个重要概念原型链,以及如何经原型链实现JavaScript中的继承。 C#的继承 首先,我们简单描述一下继承的概念:当一个类和另一个类构成"is a kind of"关系时,这两个类就构...

dengjie0448的博客 329

【JavaScript基础进阶之路】:3天彻底搞懂原型链与继承机制

掌握JavaScript原型链与继承的核心机制,本javascript基础教程详解常见继承模式及应用场景,深入解析原型链查找原理与构造函数调用逻辑。理解对象间关系的关键路径,提升代码复用能力,值得收藏。

PixelFlow的博客 999

【前端每日一题】 day3——JS的原型链如何实现继承

每个对象都有一个原型(prototype),该原型又是一个对象,而这个对象又有自己的原型,以此类推,形成了一个原型链。当试图访问一个对象的属性或方法时,JavaScript会首先在该对象本身上查找,如果找不到,就会沿着原型链向上查找,直到找到相应的属性或方法,或者到达原型链的末端。Dog 是一个子类,通过调用父类的构造函数 Animal.call(this, name) 继承了父类的属性,并通过 Object.create(Animal.prototype) 继承了父类的方法。

modaoshi51991的博客 374

js继承 1.原型链继承 2.构造继承 3.实例继承 4.拷贝继承 5.组合继承 6.寄生组合继承

js继承 继承: 子类继承父类的属性和方法 1.原型链继承 通过下面两个内置对象了解到 js底层是通过原型链继承而来的 由外到内 通过__proto__属性连接 形成链式 就叫原型链 原型链继承是通过prototype属性实现继承 原型链继承的特点: 子类的实例继承自身的实例属性 也继承父类里面的构造属性和方法 父类的原型属性和方法 缺点: 1.不能继承子类的原型属性和方法 2.只能进行单继承 不能多继承 3.继承之后 原型对象上的属性全是共享 4.子类不能直接向父类传递参数 父类 func

Gananldo04的博客 318

JS笔记3.5--原型链/继承/多态/封装

//实例对象的原型__proto__和构造函数的原型prototype指向是相同的 //实例对象中的__proto__原型指向的是构造函数中的原型prototype //构造函数中的this 和 原型对象中方法的this 都是指向 实例对象 原型链 原型链是一种关系,实例对象和原型对象之间的关系, 关系通过原型(proto)联系 原型指向可以改变 实例对象的原型__proto__指向的是该实例对象...

weixin_42139212的博客 374

JavaScript原型链机制:理解对象属性查找与继承本质

JavaScript 中的‘继承’并非传统面向对象的类复制,而是基于原型链(Prototype Chain)的动态属性查找机制。其核心原理是每个对象内部都存在 [[Prototype]] 链接,引擎按此链逐级向上搜索属性与方法;这种机制赋予了语言高度的灵活性与运行时可塑性,支撑着 Vue 3 响应式、React Fiber 节点关系、Node.js EventEmitter 等关键架构。掌握原型链不仅有助于规避 super() 报错、instanceof 失效、属性覆盖等高频陷阱,更能提升对内存布局、调试技

weixin_34009794的博客 363

原型链与继承

本文详细讲解了JavaScript的原型链、继承、类、实例和构造函数等核心概念。通过示例展示了原型链如何实现方法共享(如Person.prototype.sayHello),以及ES6类语法如何简化继承(如class Car)。同时解析了new操作符的工作原理和typeof与instanceof的类型检测区别。最后以Vue3为例,说明如何通过原型链扩展实例方法(如$set和$delete)。全文通过代码示例生动演示了这些概念的实际应用。

2202_75695913的博客 448

白骑士的JavaScript教学进阶篇之原型与继承 3.1.1 原型链的概念

JavaScript是一种面向对象的编程语言,但与许多传统的面向对象语言(如Java或C++)不同,JavaScript的对象模型是基于原型的,而不是基于类的。这种原型机制为JavaScript提供了灵活而强大的继承方式。理解原型链的概念是掌握JavaScript对象继承和属性查找机制的关键。在本节中,我们将深入探讨原型链的概念,帮助你更好地理解JavaScript中的继承机制。

JeremyTC的博客 876
上一篇: JavaScript 3.3 正则表达式2
下一篇: JavaScript 3.4 var、let、const
LetsStudy
博客等级 码龄9年 96粉丝 323原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值