广告
返回顶部
首页 > 资讯 > 精选 >JavaScript原型与继承实例分析
  • 741
分享到

JavaScript原型与继承实例分析

2023-06-27 09:06:29 741人浏览 泡泡鱼
摘要

今天小编给大家分享一下javascript原型与继承实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先我们需要知道的

今天小编给大家分享一下javascript原型与继承实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

首先我们需要知道的是,JavaScript 是一种动态语言,本质上说它是没有Class(类)的;但是它也需要一种继承的方式, 那就是原型继承;JavaScript 对象的一些属性和方法都是继承自别的对象。

很多同学对 JavaScript 的原型和继承不是很理解,一个重要的原因就是大家没有理解__proto__prototype这两个属性的意思。 接下来我们先来好好梳理一下这两个属性,看看它们存在哪里,代表了什么意义,又有什么作用。

首先来说一下__proto__这个属性吧,我们需要知道的是,除了nullundefinedJavaScript中的所有数据类型都有这个属性; 它表示的意义是:当我们访问一个对象的某个属性的时候,如果这个对象自身不存在这个属性, 那么就从这个对象的__proto__(为了方便下面描述,这里暂且把这个属性称作p0)属性上面 继续查找这个属性,如果p0上面还存在__proto__(p1)属性的话,那么就会继续在p1上面查找响应的属性, 直到查找到这个属性,或者没有__proto__属性为止。 

我们把一个对象的__proto__属性所指向的对象,叫做这个对象的原型;我们可以修改一个对象的原型来让这个对象拥有某种属性,或者某个方法。

// 修改一个Number类型的值的原型const num = 1;num.__proto__.name = "My name is 1";console.log(num.name); // My name is 1// 修改一个对象的原型const obj = {};obj.__proto__.name = "dreamapple";console.log(obj.name); // dreamapple

这里需要特别注意的是,__proto__这个属性虽然被大多数的浏览器支持,但是其实它仅在ECMAScript 2015 规范中被准确的定义, 目的是为了给这个传统的功能定制一个标准,以确保浏览器之间的兼容性。通过使用__proto__属性来修改一个对象的原型是非常慢且影响性能的一种操作。 所以,现在如果我们想要获取一个对象的原型,推荐使用Object.getPrototypeOf 或者Reflect.getPrototypeOf,设置一个对象的原型推荐使用Object.setPrototypeOf或者是Reflect.setPrototypeOf

到这里为止,我们来对__proto__属性做一个总结

  • 存在哪里? 除了nullundefined所有其他的JavaScript对象或者原始类型都有这个属性

  • 代表了什么? 表示了一个对象的原型

  • 有什么作用? 可以获取和修改一个对象的原型

说完__proto__属性,接下来我们就要好好的来理解一下prototype属性了;首先我们需要记住的是,这个属性一般只存在于函数对象上面; 只要是能够作为构造器的函数,他们都包含这个属性。也就是说,只要这个函数能够通过使用new操作符来生成一个新的对象, 那么这个函数肯定具有prototype属性。因为我们自定义的函数都可以通过new操作符生成一个对象,所以我们自定义的函数都有prototype 这个属性。

// 函数字面量console.log((function(){}).prototype); // {constructor: ƒ}// Date构造器console.log(Date.prototype); // {constructor: ƒ, toString: ƒ, toDateString: ƒ, toTimeString: ƒ, toISOString: ƒ, …}// Math.abs 不是构造器,不能通过new操作符生成一个新的对象,所以不含有prototype属性console.log(Math.abs.prototype); // undefined

那这个prototype属性有什么作用呢?这个prototype属性的作用就是:函数通过使用new操作符生成的一个对象, 这个对象的原型(也就是__proto__)指向该函数的prototype属性。 那么一个比较简洁的表示__proto__prototype 属性之间关系的等式也就出来了,如下所示:

// 其中F表示一个自定义的函数或者是含有prototype属性的内置函数new F().__proto__ === F.prototype // true

看到上面等式,我想大家对于__proto__prototype之间关系的理解应该会更深一层了。

好,接下来我们对prototype属性也做一个总结:

  • 存在哪里? 自定义的函数,或者能够通过new操作符生成一个对象的内置函数

  • 代表了什么? 它表示了某个函数通过new操作符生成的对象的原型

  • 有什么作用? 可以让一个函数通过new操作符生成的许多对象共享一些方法和属性

其实到这里为止,关于JavaScript的原型和继承已经讲得差不多了;下面的内容是一些基于上面的一些拓展, 可以让你更好地理解我们上面所说的。

当我们理解了上面的知识点之后,我们就可以对下面的表达式做一个判断了:

// 因为Object是一个函数,函数的构造器都是FunctionObject.__proto__ === Function.prototype // true// 通过函数字面量定义的函数的__proto__属性都指向Function.prototype(function(){}).__proto__ === Function.prototype // true// 通过对象字面量定义的对象的__proto__属性都是指向Object.prototype({}).__proto__ === Object.prototype // true// Object函数的原型的__proto__属性指向nullObject.prototype.__proto__ === null // true// 因为Function本身也是一个函数,所以Function函数的__proto__属性指向它自身的prototypeFunction.__proto__ === Function.prototype // true// 因为Function的prototype是一个对象,所以Function.prototype的__proto__属性指向Object.prototypeFunction.prototype.__proto__ === Object.prototype // true

如果你能够把上面的表达式都梳理清楚的话,那么说明你对这部分知识掌握的还是不错的。

谈及JavaScript的原型和继承,那么我们还需要知道另一个概念;那就是constructor,那什么是constructor呢? constructor表示一个对象的构造函数,除了nullundefined以外,JavaScript中的所有数据类型都有这个属性; 我们可以通过下面的代码来验证一下:

null.constructor // Uncaught TypeError: Cannot read property 'constructor' of null ...undefined.constructor // Uncaught TypeError: Cannot read property 'constructor' of undefined ...(true).constructor // ƒ Boolean() { [native code] }(1).constructor // ƒ Number() { [native code] }"hello".constructor // ƒ String() { [native code] }

但是其实上面这张图的表示并不算准确,因为一个对象的constructor属性确切地说并不是存在这个对象上面的; 而是存在这个对象的原型上面的(如果是多级继承需要手动修改原型的constructor属性,见文章末尾的代码),我们可以使用下面的代码来解释一下:

const F = function() {};// 当我们定义一个函数的时候,这个函数的prototype属性上面的constructor属性指向自己本身F.prototype.constructor === F; // true

关于constructor还有一些需要注意的问题,对与JavaScript的原始类型来说,它们的constructor属性是只读的,不可以修改。 我们可以通过下面的代码来验证一下:

(1).constructor = "something";console.log((1).constructor); // 输出 ƒ Number() { [native code] }

当然,如果你真的想更改这些原始类型的constructor属性的话,也不是不可以,你可以通过下面的方式来进行修改:

Number.prototype.constructor = "number constructor";(1).constructor = 1;console.log((1).constructor); // 输出 number constructor

当然上面的方式我们是不推荐你在真实的开发中去使用的,接下来,我会使用一些代码来把今天讲解的知识再大致的回顾一下:

function Animal(name) {  this.name = name;}Animal.prototype.setName = function(name) {  this.name = name;};Animal.prototype.getName = function(name) {  return this.name;};function Dog(name, breed) {  Animal.call(this, name);  this.breed = breed;}Dog.prototype = Object.create(Animal.prototype);// 因为上面的语句将我们原来的prototype的指向修改了,所以我们要重新定义Dog的prototype属性的constructor属性Reflect.defineProperty(Dog.prototype, "constructor", {  value: Dog,  enumerable: false, // 不可枚举  writable: true});const animal = new Animal("potato");console.log(animal.__proto__ === Animal.prototype); // trueconsole.log(animal.constructor === Animal); // trueconsole.log(animal.name); // potatoconst dog = new Dog("potato", "labrador");console.log(dog.name); // potatoconsole.log(dog.breed); // labradorconsole.log(dog.__proto__ === Dog.prototype); // trueconsole.log(dog.constructor === Dog); // true

以上就是“JavaScript原型与继承实例分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: JavaScript原型与继承实例分析

本文链接: https://www.lsjlt.com/news/309334.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript原型与继承实例分析
    今天小编给大家分享一下JavaScript原型与继承实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先我们需要知道的...
    99+
    2023-06-27
  • JavaScript原型继承的示例分析
    这篇文章主要介绍JavaScript原型继承的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在传统的基于Class的语言如Java、C++中,继承的本质是扩展一个已有的Cla...
    99+
    2022-10-19
  • JS原型与继承操作的示例分析
    小编给大家分享一下JS原型与继承操作的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:<script>...
    99+
    2022-10-19
  • 如何分析Js继承与原型链
    今天就跟大家聊聊有关如何分析Js继承与原型链,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。继承与原型链当谈到继承时,JavaScript 只有一种结构:对象。每个实例对象(objec...
    99+
    2023-06-22
  • JavaScript继承与多继承实例讲解
    这篇文章主要介绍“JavaScript继承与多继承实例讲解”,在日常操作中,相信很多人在JavaScript继承与多继承实例讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2022-10-19
  • JS中原型链和利用原型实现继承的示例分析
    小编给大家分享一下JS中原型链和利用原型实现继承的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!原型链原型链是一种关系,实例对象和原型对象之间的关系,关系是通过原型(__proto...
    99+
    2022-10-19
  • Maven的继承与聚合实例分析
    这篇文章主要介绍“Maven的继承与聚合实例分析”,在日常操作中,相信很多人在Maven的继承与聚合实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Maven的继承与聚合实例分析”的疑惑有所帮助!接下来...
    99+
    2023-07-02
  • Kotlin继承实例分析
    本篇内容介绍了“Kotlin继承实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Kotlin中所有的类都有一个公有的超类:Any,这是...
    99+
    2023-06-17
  • javascript中实现继承的示例分析
    小编给大家分享一下javascript中实现继承的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!类式继承//声明父类//声明父类function SuperClass() { &nbs...
    99+
    2023-06-27
  • javascript中继承的示例分析
    这篇文章主要介绍javascript中继承的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!javascript 中的继承实例详解阅读目录原型链继承借用构造函数组合继承寄生组合...
    99+
    2022-10-19
  • JavaScript的原型对象与原型链实例分析
    本篇内容介绍了“JavaScript的原型对象与原型链实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、prototype和__pr...
    99+
    2023-07-02
  • JavaScript原型实例分析
    这篇文章主要讲解了“JavaScript原型实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript原型实例分析”吧!先看三个对象一、构造函数(对象):JS中声明函数的三种...
    99+
    2023-06-29
  • Java的继承实例分析
    这篇文章主要介绍“Java的继承实例分析”,在日常操作中,相信很多人在Java的继承实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java的继承实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-29
  • JavaScript组合继承的示例分析
    这篇文章主要为大家展示了“JavaScript组合继承的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript组合继承的示例分析”这篇文章吧。原型链继承父类实例作为子类的原型...
    99+
    2023-06-25
  • JS继承、工厂构造及原型设计模式实例分析
    这篇文章主要介绍“JS继承、工厂构造及原型设计模式实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JS继承、工厂构造及原型设计模式实例分析”文章能帮助大家解决问题。正文正是由于:原型链继承和构...
    99+
    2023-07-02
  • javascript中原型与原型链的示例分析
    这篇文章主要为大家展示了“javascript中原型与原型链的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript中原型与原型链的示例分析...
    99+
    2022-10-19
  • css继承盒模型的示例分析
    这篇文章给大家分享的是有关css继承盒模型的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。继承盒模型让盒模型从html 继承:html {    &nbs...
    99+
    2023-06-27
  • JavaScript原型及实例分析
    今天就跟大家聊聊有关JavaScript原型及实例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。构造函数 实例 原型三者的关系任何函数都有一个prototype属性,该属性是一个...
    99+
    2023-06-22
  • CSS继承问题实例分析
    本篇内容介绍了“CSS继承问题实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 根据 CSS目前的...
    99+
    2022-10-19
  • Java继承使用实例分析
    本篇内容介绍了“Java继承使用实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!继承继承就是子类继承父类的特征和行为,使得子类对象(实...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作