Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript继承和原型链

JavaScript继承和原型链

原创
作者头像
前端航航
发布于 2022-11-11 02:11:36
发布于 2022-11-11 02:11:36
46100
代码可运行
举报
文章被收录于专栏:JavaScript交流JavaScript交流
运行总次数:0
代码可运行

继承和原型链

大家好,这篇文章我将会和大家分享JS关于继承和原型链的有关知识。

首先,让我们了解一下什么是原型对象。

JS在加载构造函数时,会在内存中生成一个对象,这个对象称为函数的原型对象(prototype)

每个实例对象(object)都有一个私有属性(称之为__proto__),指向它的构造函数的原型对象。这个原型对象也有一个自己的原型属性,指向它的构造函数的原型对象,层层向上直到一个对象的原型对象为null,根据定义,null没有原型,并作为这个原型链中的最后一个环节。

请看下面的例子

遵循ECMAScript标准,[[Prototype]]用于表示实例对象的原型属性,这和非JavaScript标准但很多浏览器实现的proto属性一样,但不应与prototype混淆。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var object = new Object();
//object是Object的一个实例对象
//object.[[Prototype]]指向Object.prototype

null位于原型链的顶端,根据定义,null就是没有原型。

继承属性

JavaScript对象是动态的属性“包”,它有一个指向它的原型的链。当试图访问一个对象的属性时,它不仅仅会在该对象上搜寻,还会在该对象的原型上搜寻,直到找到名字相同的属性或到达原型链的末尾。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Car(){
    this.showColor = function(){
        console.log(this.color);
    }
}
Car.prototype.color = "red";
var car = new Car();
car.showColor();//log "red"
car.color = "blue";
car.showColor();//log "blue";
//Car.prototype上有属性color,但car已经有color属性,所以不会再向上搜寻,这种现象叫做属性屏蔽

继承方法

JavaScript没有像其他基于类的语言所定义的“方法”,任何函数都可以添加到对象上作为对象的属性。函数的继承和其他属性的继承没有差别,包括上面的属性屏蔽。

需要注意的是,当继承的函数被调用时,this指向的是当前继承的对象,而不是继承的函数所在的原型对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Car(){
    this.showColor = funciton(){
        console.log(this.color);
    }
}
Car.color = "red";
var car = new Car();
car.showColor();//log "red"

使用不同的方法来创建对象和生成原型链

使用语法结构创建对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var car = {a:1};
//这个对象car/继承了Object.prototype上的所有属性
//Object.prototype的原型为null
//原型链为car --> Object.prototype --> null
var a = [a:1];
//数组都继承于Array.prototype
//Arrat.prototype继承于Object.prototype
//原型链为a --> Array.prototypr --> Object.prototype --> null
function f(){

}
//函数都继承于Function.prototype
//原型链为f --> Funciton.prototype --> Object.prototype --> null

使用构造器创建对象

在JavaScript中,构造器其实就是一个普通的函数。当使用new操作符来作用这个函数时,它就可以被称为构造方法(构造函数)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Car(){
    this.color = "red";
}
var car = new Car();
//car是生成的对象,它自身拥有属性color
//在car/被实例化时,car.[[prototype]]指向了Car.prototype

使用Object.create()创建对象

ECMAScript 5中引入了一个新方法: Object.create()。可以调用这个方法来创建一个新的对象。新的对象的原型就是这个方法中传入的第一个参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var Car = {
    color : "red"
}
var car = Object.create(Car);
//car.[[Prorotype]]为Car
//原型链为car --> Car --> Function.prototype --> Object.prototype --> null

使用class关键字创建对象

ECMAScript6引入了一套新的关键字来实现class。使用基于类语言的开发人员会对这些结构感到熟悉。但它们是不同的,JavaScript仍然基于原型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Hang{
    constructor (color){
        this.color = color;
    }
}
var hang = new Hang("red");

性能

在原型上查找属性比较耗时,会对性能产生一些副作用。这在对性能要求苛刻的场景很重要。另外,试图访问不存咋的属性时会遍历整个原型链。

遍历对象的属性时,原型链上的每个可枚举属性都会被枚举出来出来。要检查对象是否具有自己的每个属性,而不是其原型链上是否具有每个属性,则必须使用对象从Object.prototype上继承的hasOwnProperty方法。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript继承与原型链
当谈到继承时,JavaScript 只有一种结构:对象。每个实例对象(object)都有一个私有属性(称之为 __proto__)指向它的构造函数的原型对象(prototype)。该原型对象也有一个自己的原型对象(__proto__),层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。
Andromeda
2023/10/21
1780
JavaScript继承与原型链
JavaScript 设计模式学习第五篇-继承与原型链
JavaScript 是一种灵活的语言,兼容并包含面向对象风格、函数式风格等编程风格。我们知道面向对象风格有三大特性和六大原则,三大特性是封装、继承、多态,六大原则是单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则(DIP)、接口分离原则(ISP)、最少知识原则(LKP)。
越陌度阡
2020/11/26
3010
JavaScript 设计模式学习第五篇-继承与原型链
Javascript 原型链
每个实例对象(object)都有一个私有属性(称之为 __proto__ )指向它的构造函数的原型对象(prototype)。该原型对象也有一个自己的原型对象(__proto__),层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。
超级大帅比
2021/09/06
5850
原型链
每个实例对象(object)都有一个私有属性(__proto__)指向其构造函数的原型对象(prototype)。该原型对象也有自己的原型对象,层层向上直到一个对象的原型对象为null。根据定义null没有原型,并作为原型链的最后一个环节。
用户3258338
2020/03/12
4430
再谈javascriptjs原型与原型链及继承相关问题
普通的内置对象与基本包装类型的主要区别就是对象的生命期,使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中,而自动创建的基本包装类型的对象,则只是存在于一行代码的执行瞬间,然后立即被立即销毁。这意味着我们不能再运行时为基本包装类型值添加属性和方法。
IMWeb前端团队
2019/12/04
5450
一篇JavaScript技术栈带你了解继承和原型链
在学习JavaScript中,我们知道它是一种灵活的语言,具有面向对象,函数式风格的编程模式,面向对象具有两点要记住,三大特性,六大原则。
达达前端
2019/11/19
4650
深入JavaScript原型链污染
相比其他语言(如Java、python等传统OOP语言),JavaScript的机制和类完全不同。
raye
2024/02/04
2301
知识点梳理
1.ECMAScript和javaScript的关系 可简单概括为:ECMAScript是JavaScript的规范,JavaScript是ECMAScript的实现。 红宝书第一章小结: js是一种专为与网页交互而设计的脚本语言,由下列三个不同部分组成: 核心ECMAScript,提供核心语言功能; 文档对象模型(DOM),提供访问和操作网页内容的方法和接口; 浏览器对象模型(BOM),提供与浏览器交互的方法和接口。 JavaScript实现了ECMAScript规范(同样实现ECMAScript的还有A
小胖
2018/06/28
7280
JS原型链与继承别再被问倒了
继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实现继承则继承实际的方法.由于js中方法没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支持实现继承,而且其 实现继承 主要是依靠原型链来实现的.
全栈程序员站长
2021/06/10
6330
关于javascript的原型和原型链,看我就够了(三)
原型对象有一个constructor属性,指向该原型对象对应的构造函数 foo 为什么有 constructor 属性?那是因为 foo 是 Foo 的实例。 那 Foo.prototype 为什么有 constructor 属性??同理, Foo.prototype Foo 的实例。 也就是在 Foo 创建的时候,创建了一个它的实例对象并赋值给它的 prototype
陌上寒
2019/04/02
5160
关于javascript的原型和原型链,看我就够了(三)
关于javascript的原型和原型链,看我就够了(一)
关于js的原型和原型链,有人觉得这是很头疼的一块知识点,其实不然,它很基础,不信,往下看 要了解原型和原型链,我们得先从对象说起
陌上寒
2019/04/02
3660
关于javascript的原型和原型链,看我就够了(一)
《现代Javascript高级教程》JavaScript中的原型与继承
JavaScript是一门支持面向对象编程的语言,它的函数是第一公民,同时也拥有类的概念。不同于传统的基于类的继承,JavaScript的类和继承是基于原型链模型的。在ES2015/ES6中引入了class关键字,但其本质仍然是基于原型链的语法糖。
linwu
2023/07/27
2630
《现代Javascript高级教程》JavaScript中的原型与继承
一站搞定原型链:深入理解JavaScript的继承机制
JavaScript 的原型链(prototype chain)是理解 JavaScript 对象和继承机制的关键。它是通过对象的原型(prototype)属性实现的,用于实现对象属性和方法的共享和继承。以下是对 JavaScript 原型链的详细介绍,这一篇文章将会通过理论与demo相结合的方式,力争一文概括原型、对象、原型链以及基于原型链实现JavaScript的继承机制的所有方面,帮助您一站式搞定原型链。
watermelo37
2025/01/22
940
一站搞定原型链:深入理解JavaScript的继承机制
彻底搞懂JS原型与原型链
说到JavaScript的原型和原型链,相关文章已有不少,但是大都晦涩难懂。本文将换一个角度出发,先理解原型和原型链是什么,有什么作用,再去分析那些令人头疼的关系。
hellocoder2029
2022/10/17
3.1K1
JavaScript 进阶教程(3)---让你彻底搞懂原型链和继承
关于原型在JavaScript 进阶教程(1)--面向对象编程这篇文章已经讲过了,今天简单来复习一下。
AlbertYang
2020/09/08
5240
JavaScript 进阶教程(3)---让你彻底搞懂原型链和继承
关于javascript的原型和原型链,看我就够了(二)
Object就是一个构造函数,是js内置的构造函数,上面的例子中Object就是obj的构造函数,这个例子似乎不太明显,我们继续看
陌上寒
2019/04/02
5030
关于javascript的原型和原型链,看我就够了(二)
JavaScript原型链与继承
只要是对象,一定有原型对象,就是说只要这个东西是个对象,那么一定有proto属性。(错的)
用户7043603
2022/02/26
1.6K0
js中的原型和原型链
在js中每个函数(非箭头函数,一般关于原型的有关知识我们都只考虑构造函数)都会拥有一个 prototype 属性,该属性值是一个对象,我们称之为原型对象。原型对象上默认会有 constructor 属性,指向该构造函数。创建原型的主要目的是为了对象实例共享属性和方法。
用户10562852
2023/05/21
1.2K0
js中的原型和原型链
构造对象,原型和原型链笔记
面向对象:面向对象、原型 对原型、原型链、 Function、Object 的理解 什么是 JS 原型链? 转载以上文章
bamboo
2019/01/29
4930
构造对象,原型和原型链笔记
JavaScript原型链档案
事实上JavaScript一直以来都是基于对象和原型的,除了Number、String、Boolean等基本数据类型之外,JavaScript中的一切都是对象。ES6中新增的class、constructor、static、extends、super等关键字都是基于对象和原型的语法糖。
gojam
2019/05/14
3760
推荐阅读
相关推荐
JavaScript继承与原型链
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验