java 原型图_一张图搞懂原型、原型对象、原型链
基本概念
在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 原型图_一张图搞懂原型、原型对象、原型链相关推荐
- 多x多y的origin图_一张图了解iPhone 12 mini到底有多小
近日苹果发布了 iPhone 12 系列新机,一共有四款,其中有一款屏幕只有 5.4 英寸的 iPhone 12 mini,不仅屏幕最小,由于采用的全面屏刘海设计,它的机身整体尺寸也很小. 根据苹果官 ...
- java数据类型划分_一张图搞定java数据类型的划分
基本数据类型 byte.short.int.long.float.double.char.boolean Java基本数据类型的大小.范围.默认值 No. 数据类型 大小/位 可表示的数据范围 默认值 ...
- java 变量锁_一张图看透java的“锁”事
Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率. Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家 ...
- 围棋JAVA判断胜负_几张图教会你:围棋终局胜负计算
作者:弈智围棋 小棋手们在下完棋之后,总会高高地举起小手,同时大声地问道:"老师!这盘棋谁赢了???!"呐,今天,老师就来告诉你们,围棋是怎样判断胜负的. 围棋的胜负是以双方在棋盘 ...
- 【OpenGL ES】立方体贴图(6张图)
1 前言 本文通过一个立方体贴图的例子,讲解三维纹理贴图的应用,案例中使用 6 张不同的图片给立方体贴图,图片如下: 本文涉及到的知识点主要包含:三维绘图.MVP 矩阵变换.纹理贴图,读者如果对 Op ...
- 一张图学会python-一张图让你学会Python
Python是一个非常适合初学者入门的编程语言.相比较其他不少主流编程语言,有更好的可读性,因此上手相对容易.自带的各种模块加上丰富的第三方模块,免去了很多"重复造轮子"的工作,可 ...
- arcgis批量出图python代码_【GIS进阶】ArcGIS批量出图_定义出图
今天的文章是浩哥投稿!!! 下图是我欢呼雀跃的样子~~~~~ 本文亮点: 所有步骤都是用ArcGIS中各种工具和软件操作组合,未使用Arcpy与Python等需要使用代码的工具! 这次的这个批量出图又 ...
- java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...
0 前言 初学JAVA时,总会对一些概念一知半解,相互混淆,不明其设计的用意,如类.对象.重载.封装.继承.多态.覆盖.抽象类.接口概念.为便于理解和巩固,本文将基于一个案例及其变形,展现各个概念的定 ...
- python构造方法与java区别_一张图秒懂Java和Python的区别,你知道吗?
对于程序员的语言千千万JAVA\C\C++\PHP\Python不同的程序员使用着不同的语言,做着功能相似需求却不同的产品. 但是最近Python在人工智能的推动下突然出现在人们的面前,其实和Java ...
最新文章
- mysql5.7多实例安装_MySQL数据库5.7多实例安装
- html ascii编码方式,HTML 字符集 参考手册
- spring-boot发送邮件失败 AuthenticationFailedException: 535 Authentication Failed
- Java语言所有异常类均继承自_Java将运行错误分为两类:(__)和(__), 其对应的类均派生自(__)类;...
- 架构设计 | 分布式事务①概念简介和基础理论
- oracle crf路径,说说 ora.crf 那些事
- SOTIF - 汽车感知系统验证和确认
- liunx服务器数据库文件大小,linux如何查看数据库服务器大小
- 低介电常数微波介质陶瓷基覆铜板的研究
- 数据标注:语义分割数据标注工具labelme安装、使用方法
- 微软模拟飞行2020服务器多少内存,《微软模拟飞行2020》到底有多大?我们的硬盘装得下吗?...
- 最小二乘法及其代码实现
- 域名whois查询接口代码
- oracle wallet java_使用Oracle sqlplus Instant客户端访问Oracle Wallet
- 加密IC卡保险柜控制器的设计
- 简单线性回归Ridge的应用及画图(二)
- 简单Java类映射转换
- 语义分析的一些方法(三)
- 显卡在计算机系统中的作用,显卡的作用是什么
- 表单控件<input>
热门文章
- 吴恩达:神经网络和深度学习(Neural Networks and Deep Learning)
- python操作pdf——pdfplumber/PyPDF2
- 计算机网络统考outlook操作视频,网络教育计算机统考Outlook
- HDU 1107 武林 大模拟
- 12月9日科技资讯|苹果三星手机被诉辐射超标;淘集集启动破产清算;Apache Flink 1.9.1 发布 |
- iOS和Android的app界面设计规范
- Vue组件通信(父传子、子传父、兄弟通信)
- [转]英文自我介绍范文
- python爬虫爬取qq音乐热歌榜的歌曲到本地
- 微生太 | 宏基因组分箱Binning(一)基础介绍与报告展示