位置: 编程技术 - 正文

JavaScript中的原型prototype完全解析(如何理解js中的原型)

编辑:rootadmin

推荐整理分享JavaScript中的原型prototype完全解析(如何理解js中的原型),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript基于原型,如何理解js中的原型,javascript原型,javascript原生,javascript中的原型和原型链,javascript中的原型和原型链,javascript原型,javascript原型,内容如对您有帮助,希望把文章链接给更多的朋友!

要理解JS中的prototype, 首先必须弄清楚以下几个概念 1. JS中所有的东西都是对象

2. JS中所有的东西都由Object衍生而来, 即所有东西原型链的终点指向Object.prototype

3. JS中构造函数和实例(对象)之间的微妙关系 构造函数通过定义prototype来约定其实例的规格, 再通过 new 来构造出实例, 他们的作用就是生产对象. 而构造函数(方法)本身又是方法(Function)的实例, 因此也可以查到它的__proto__(原型链)

Object / function F() {} 这样子的就是构造函数啦, 一个是JS原生API提供的, 一个是自定义的 new Object() / new F() 这样子的就是实例啦 实例就"只能"查看__proto__来得知自己是基于什么prototype被制造出来的, 而"不能"再重新定义实例的prototype妄想创造出实例的实例了.

实践出真知, 只有自己动手观察/思考才能真正领悟:

你可能已经晕了, 我们来分解一下。

prototype prototype输出的格式为: 构造函数名 原型 首先看下Object.prototype输出了什么&#; Object {} -> 前面的Object为构造函数的名称, 后面的那个表示原型, 这里是一个{}, 即一个Object对象的实例(空对象) 那么 F {} 我们就明白是什么意思了, F 就是构造函数的名称, 原型也是一个空对象

我们再深入一点, 定义下 F 的原型看看到底会发生些什么&#;

这样我们就清楚的看到 i 是由 F 构造出来的, 原型是 {a: function}, 就是原本的空对象原型新增了一个 a 方法

我们再换一种情况, 完全覆盖 F 的原型会怎么样&#;

咦~ 为什么这里表明 i 是由 Object 构造出来的&#; 不对吧! 因为我们完全将 F 的prototype覆盖, 其实也就是将原型指定为对象{a: function}, 但这会造成原本的constructor信息丢失, 变成了对象{a: function}指定的constructor. 那么对象{a: function}的constructor是什么呢&#; 因为对象{a: function}其实就相对于

那么o的constructor当然是 Object 啦

我们来纠正下这个错误

现在又能得到正确的原型信息了~

原型链

然后来看看什么原型链又是个什么东西&#; 简单的来讲和OOP中的继承关系(链)是一样的, 一层一层往上找, 直至最终的 Object.prototype

最最关键的是要弄清楚JS中哪些东西是(实例)对象, 这个简单了, JS中所有东西都是对象! 再要弄清楚就是任何一个对象都是有一个原型的!

那么我们来证明一下:

JavaScript中的原型prototype完全解析(如何理解js中的原型)

Prototype和__proto__每一个对象都包含一个__proto__,指向这个的对象的“原型”。类似的事情是,每一个函数都包含一个prototype,这个prototype对象干什么的了?

咱们看看如下代码,用构造函数来创建一个对象(上面是用字面量的形式创建对象)。

试想想,这个foo对象的__proto__会指向什么?

一个包含constructor属性的对象?看不太懂没关系,把函数Foo的prototype属性打印出来,对比一下就知道了。

原来,new出来的对象foo的__proto__就只指向函数Foo的prototype。

JS这么设计有何意义了?回忆下上面说的,在JS的世界中,对象不是根据类(模具)创建出来的,而是从原型(另一个对象)衍生出来的。

当我们执行new操作创建一个新的对象时,先不深入new操作的具体实现,但有一点我们是肯定的——就是为新对象的__proto__指向一个原型对象。

就刚才这段代码

foo.__proto__到底要指向谁了?你怎么不能指向Foo这个函数本身吧,虽然函数也是对象,这个有机会会详细讲。但如何foo.__proto__指向Foo固然不合适,因为Foo是一个函数,有很多逻辑代码,foo作为一个对象,继承逻辑处理没有任何意义,它要继承的是“原型对象”的属性。

所以,每个函数会自动生成一个prototype对象,由这个函数new出来的对象的__proto__就指向这个函数的prototype。

总结说了这么多,感觉还是没完全说清楚,不如上一张图。我曾经参考过其他网友的图,但总觉得哪里没说清楚,所以我自己画了一张图,如果觉得我的不错,请点个赞!(老子可是费了牛劲才画出来)。

咱们就着这张图,记住如下几个事实:

1. 每个对象中都有一个_proto_属性。

JS世界中没有类(模具)的概念,对象是从另一个对象(原型)衍生出来的,所以每个对象中会有一个_proto_属性指向它的原型对象。(参考左上角的那个用字面量形式定义的对象obj,它在内存中开辟了一个空间存放对象自身的属性,同时生成一个_proto_指向它的原型——顶层原型对象。)

2. 每个函数都有一个prototype属性。

“构造函数”为何叫构造函数,因为它要构造对象。那么根据上面第一条事实,构造出来的新对象的_proto_属性指向谁了?总不能指向构造函数自身,虽然它也是个对象,但你不希望新对象继承函数的属性与方法吧。所以,在每个构造函数都会有一个prototype属性,指向一个对象作为这个构造函数构造出来的新对象的原型。

3. 函数也是对象。

每个函数都有一些通用的属性和方法,比如apply()/call()等。但这些通用的方法是如何继承的呢?函数又是怎么创建出来的呢?试想想,一切皆对象,包括函数也是对象,而且是通过构造函数构造出来的对象。那么根据上面第二条事实,每个函数也会有_proto_指向它的构造函数的prototype。而这个构造函数的函数就是Function,JS中的所有函数都是由Function构造出来的。函数的通用属性与方法就存放在Function.prototype这个原型对象上。

解析JavaScript面向对象概念中的Object类型与作用域 引用类型引用类型主要包括:Object类型、Array类型、Date类型、RegExp类型、Function类型等等。引用类型使用时,需要从它们身上生成一个对象(实例)。也

JS创建事件的三种方法(实例代码) 1.普通的定义方式inputtype="button"name="Button"value="确定"onclick="Sfont=prompt('请在文本框中输入红色','红色','提示框');if(Sfont=='红色'){form1.style.fontFamily='黑体';for

全面理解JavaScript中的闭包 引子闭包是有权访问另一个函数作用域中的变量的函数。闭包是javascript中很难理解的部分,很多高级的应用都依靠闭包来实现的,我们先来看下面的一

标签: 如何理解js中的原型

本文链接地址:https://www.jiuchutong.com/biancheng/370037.html 转载请保留说明!

上一篇:简单解析JavaScript中的__proto__属性(简单解析空中三角测量的意义)

下一篇:解析JavaScript面向对象概念中的Object类型与作用域(java 解析javascript)

  • 农副产品免税发票抵扣多少税率
  • 房产税应该怎么申报
  • 纳税申报的流程如何?面试怎么说
  • 即征即退进项税额为哪些
  • 税控盘如何统计开票金额
  • 党建经费可以用来干什么
  • 汇算清缴业务招待费调整分录
  • 盘盈存货会计处理会计分录
  • 折旧方法改变属于会计政策变更还是估计变更
  • 计提坏账准备的做法体现了什么的信息质量要求
  • 在建工程 费用
  • 单位装饰
  • 发票勾选认证截图图片
  • 公司发的现金
  • 企业可以同时按一般纳税和按小规模纳税吗?
  • 外贸企业出口退税账务处理
  • 开模具公司要什么设备
  • 结转主营业务成本是含税还是不含税
  • 党建工作经费计提比例
  • 农贸市场可以收什么的费
  • 多缴纳的增值税怎么申请抵税
  • 会计凭证和记账凭证的区别是什么
  • mac系统屏幕
  • 桌面图标被篡改怎么办
  • win7系统中病毒怎么办
  • 鸿蒙系统进入工程菜单
  • 人力资源服务代缴社保税率是多少
  • 工商年检需准备什么资料
  • 上飞机可以带2个充电宝吗
  • php实现上传图片功能
  • 取得交易性金融资产的交易费用
  • thinkphp count
  • vue中watch监听对象的变化
  • 微信小程序的视频怎么下载
  • thinkphp分表查询
  • php用户登录界面代码
  • 林场苗圃工作有哪些
  • phpcms模块
  • php的默认网站目录是
  • 利润分配的5个基本原则
  • 上期金额是属于负债吗
  • 长期股权投资减值准备是什么科目
  • 处置资产增值税纳税义务发生时间
  • 会计从业资格证取消了吗
  • 个人所得税申报数
  • 营业利润净利润利润总额的区别
  • 投资收益在什么科目
  • 小规模销售免税产品需要交税吗
  • 进项税额转出后续处理
  • 建设项目财务费用包括哪些
  • 实收资本增加印花税税目怎么填
  • 增值税相关的问题
  • 个税返还申请流程
  • 公司购买的车辆
  • 会议服务公司名称大全
  • 数据库sql分组
  • sedsvc.exe是什么
  • windows10的设置在哪里
  • win10怎么运行安卓软件
  • centos 怎么用
  • mac系统删除系统软件
  • 64位ubuntu8.04 安装QQ
  • 菜鸟教程官网app
  • win7系统怎么把c盘的内存加到d盘
  • 飞信安卓下载
  • 微软为什么这么贵
  • opengl教程48讲
  • ExtJS4如何给同一个formpanel不同的url
  • 制作网站页面
  • js引入css文件
  • js中math.pow
  • c# 抽象类的作用
  • unity3d操作
  • 轮廓模式
  • js调用css动画
  • 小规模纳税人收到增值税专用发票怎么办
  • 打印缴纳社保电子缴税凭证
  • 江苏国税电子税务局网上申报流程
  • 加强宣传的名言警句
  • 劳务派遣工为什么没年假了
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设