基本概念

在javascript中,函数可以有属性。 每个函数都有一个特殊的属性叫作原型(prototype)

每个对象拥有一个原型对象 [[Prototype]] / __proto__ / Object.getPrototypeOf(object1)

通过原型对象一级一级的往上找的这个过程就是原型链

原型

每个函数都有一个特殊的属性叫作原型(prototype), 默认为空函数,可以重写

function fn1() {}

console.log(fn1.prototype)

复制代码

重写原型之后会导致 constructor 指向错误

fn1.prototype = {}

console.log(fn1.prototype)

复制代码

需将 constructor 重新指向当前构造函数

fn1.prototype.constructor = fn1

复制代码

原型对象

每一个函数的原型对象指向 Function 的原型

function fn() {}

console.log(fn.__proto__ === Function.prototype) // true

复制代码

每一个数组的原型对象指向 Array 的原型

const arr = []

console.log(arr.__proto__ === Array.prototype) // true

复制代码

每一个对象(除 new 出来的)的原型对象指向 Object 的原型

const obj = {}

console.log(obj.__proto__ === Object.prototype) // true

复制代码

Function、Array 的原型的原型对象都指向 Object 的原型

console.log(Function.prototype.__proto__ === Object.prototype) // true

console.log(Array.prototype.__proto__ === Object.prototype) // true

复制代码

继承

通过对象冒充(call/apply)的方式实现继承

function Person(name, age, sex) {

this.name = name

this.age = age

this.sex = sex

}

Person.prototype.myself = function() {

console.log('my name is' + this.name)

}

function Status(name, age, sex, student) {

Person.call(this, name, age, sex)

this.student = student

}

Status.prototype.duties = function() {

console.log('我的职责是:好好学习,天天向上!')

}

const s1 = new Status('Tom', 20, '男', '20041002')

s1.duties()

// s1.myself()

通过对象冒充(call/apply)的方式继承时,只能继承构造函数里面的属性及方法,不能继承原型上面的

复制代码

对象冒充(call/apply) + 实例化构造函数的模式实现继承

function Person(name, age, sex) {

this.name = name

this.age = age

this.sex = sex

}

Person.prototype.myself = function() {

console.log('my name is' + this.name)

}

function Status(name, age, sex, student) {

Person.call(this, name, age, sex)

this.student = student

}

Status.prototype = new Person()

Status.prototype.constructor = Status

Status.prototype.duties = function() {

console.log('我的职责是:好好学习,天天向上!')

}

const s2 = new Status('Tom', 20, '男', '20041002')

console.log(s2)

s2.duties()

s2.myself()

多实例化了一次构造函数

复制代码

对象冒充(call/apply) + Object.create()

function Person(name, age, sex) {

this.name = name

this.age = age

this.sex = sex

}

Person.prototype.myself = function() {

console.log('my name is' + this.name)

}

function Status(name, age, sex, student) {

Person.call(this, name, age, sex)

this.student = student

}

Status.prototype = Object.create(Person.prototype)

Status.prototype.constructor = Status

Status.prototype.duties = function() {

console.log('我的职责是:好好学习,天天向上!')

}

const s3 = new Status('Tom', 20, '男', '20041002')

console.log(s3)

s3.duties()

s3.myself()

在上面的方案里面少了一次构造函数的实例化

复制代码

原型链

function Person(name, age, sex) {

this.name = name

this.age = age

this.sex = sex

}

Person.prototype.des = 'Person class'

Person.prototype.myself = function() {

console.log('my name is' + this.name)

}

function Status(name, age, sex, student) {

Person.call(this, name, age, sex)

this.student = student

}

Status.prototype = Object.create(Person.prototype)

Status.prototype.constructor = Status

Status.prototype.duties = function() {

console.log('我的职责是:好好学习,天天向上!')

}

const s4 = new Status('Tom', 20, '男', '20041002')

console.log(s4.des)

console.log(s4.type)

s4.des/s4.type 首先从 s4 实例上开始查找,找不到再从原型对象中找

Status.prototype 中也找不到接着再从原型对象中找

Person.prototype 中找得到 des 返回结果,找不到 type 接着往原型对象中找

null 到达原型链顶层,最后对找不到的属性返回 undefined

复制代码

原型链关系图

【笔记不易,如对您有帮助,请点赞,谢谢】

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[一张图搞懂原型、原型对象、原型链]http://www.zyiz.net/tech/detail-132509.html

java 原型图_一张图搞懂原型、原型对象、原型链相关推荐

  1. 多x多y的origin图_一张图了解iPhone 12 mini到底有多小

    近日苹果发布了 iPhone 12 系列新机,一共有四款,其中有一款屏幕只有 5.4 英寸的 iPhone 12 mini,不仅屏幕最小,由于采用的全面屏刘海设计,它的机身整体尺寸也很小. 根据苹果官 ...

  2. java数据类型划分_一张图搞定java数据类型的划分

    基本数据类型 byte.short.int.long.float.double.char.boolean Java基本数据类型的大小.范围.默认值 No. 数据类型 大小/位 可表示的数据范围 默认值 ...

  3. java 变量锁_一张图看透java的“锁”事

    Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率. Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家 ...

  4. 围棋JAVA判断胜负_几张图教会你:围棋终局胜负计算

    作者:弈智围棋 小棋手们在下完棋之后,总会高高地举起小手,同时大声地问道:"老师!这盘棋谁赢了???!"呐,今天,老师就来告诉你们,围棋是怎样判断胜负的. 围棋的胜负是以双方在棋盘 ...

  5. 【OpenGL ES】立方体贴图(6张图)

    1 前言 本文通过一个立方体贴图的例子,讲解三维纹理贴图的应用,案例中使用 6 张不同的图片给立方体贴图,图片如下: 本文涉及到的知识点主要包含:三维绘图.MVP 矩阵变换.纹理贴图,读者如果对 Op ...

  6. 一张图学会python-一张图让你学会Python

    Python是一个非常适合初学者入门的编程语言.相比较其他不少主流编程语言,有更好的可读性,因此上手相对容易.自带的各种模块加上丰富的第三方模块,免去了很多"重复造轮子"的工作,可 ...

  7. arcgis批量出图python代码_【GIS进阶】ArcGIS批量出图_定义出图

    今天的文章是浩哥投稿!!! 下图是我欢呼雀跃的样子~~~~~ 本文亮点: 所有步骤都是用ArcGIS中各种工具和软件操作组合,未使用Arcpy与Python等需要使用代码的工具! 这次的这个批量出图又 ...

  8. java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...

    0 前言 初学JAVA时,总会对一些概念一知半解,相互混淆,不明其设计的用意,如类.对象.重载.封装.继承.多态.覆盖.抽象类.接口概念.为便于理解和巩固,本文将基于一个案例及其变形,展现各个概念的定 ...

  9. python构造方法与java区别_一张图秒懂Java和Python的区别,你知道吗?

    对于程序员的语言千千万JAVA\C\C++\PHP\Python不同的程序员使用着不同的语言,做着功能相似需求却不同的产品. 但是最近Python在人工智能的推动下突然出现在人们的面前,其实和Java ...

最新文章

  1. mysql5.7多实例安装_MySQL数据库5.7多实例安装
  2. html ascii编码方式,HTML 字符集 参考手册
  3. spring-boot发送邮件失败 AuthenticationFailedException: 535 Authentication Failed
  4. Java语言所有异常类均继承自_Java将运行错误分为两类:(__)和(__), 其对应的类均派生自(__)类;...
  5. 架构设计 | 分布式事务①概念简介和基础理论
  6. oracle crf路径,说说 ora.crf 那些事
  7. SOTIF - 汽车感知系统验证和确认
  8. liunx服务器数据库文件大小,linux如何查看数据库服务器大小
  9. 低介电常数微波介质陶瓷基覆铜板的研究
  10. 数据标注:语义分割数据标注工具labelme安装、使用方法
  11. 微软模拟飞行2020服务器多少内存,《微软模拟飞行2020》到底有多大?我们的硬盘装得下吗?...
  12. 最小二乘法及其代码实现
  13. 域名whois查询接口代码
  14. oracle wallet java_使用Oracle sqlplus Instant客户端访问Oracle Wallet
  15. 加密IC卡保险柜控制器的设计
  16. 简单线性回归Ridge的应用及画图(二)
  17. 简单Java类映射转换
  18. 语义分析的一些方法(三)
  19. 显卡在计算机系统中的作用,显卡的作用是什么
  20. 表单控件<input>

热门文章

  1. 吴恩达:神经网络和深度学习(Neural Networks and Deep Learning)
  2. python操作pdf——pdfplumber/PyPDF2
  3. 计算机网络统考outlook操作视频,网络教育计算机统考Outlook
  4. HDU 1107 武林 大模拟
  5. 12月9日科技资讯|苹果三星手机被诉辐射超标;淘集集启动破产清算;Apache Flink 1.9.1 发布 |
  6. iOS和Android的app界面设计规范
  7. Vue组件通信(父传子、子传父、兄弟通信)
  8. [转]英文自我介绍范文
  9. python爬虫爬取qq音乐热歌榜的歌曲到本地
  10. 微生太 | 宏基因组分箱Binning(一)基础介绍与报告展示