全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

js 原型对象和原型链理解

一个例子让你彻底明白原型对象和原型链

开篇

之前对js中的原型链和原型对象有所了解,每当别人问我什么是原型链和原型对象时,我总是用很官方(其实自己不懂)的解释去描述。有一句话说的好:如果你不能把一个很复杂的东西用最简单的话语描述出来,那就说明你没有真正的理解。最近正在读《Javascript高级程序设计》,书中对原型对象和原型链的描述让我受益匪浅,下面仅用一个对比性的例子来说明。

我们经常会这么写

 function Person () {
 this.name = 'John';
 }
 var person = new Person();
 Person.prototype.say = function() {
 console.log('Hello,' + this.name);
 };
 person.say();//Hello,John

上述代码非常简单,Person原型对象定义了公共的say方法,虽然此举在构造实例之后出现,但因为原型方法在调用之前已经声明,因此之后的每个实例将都拥有该方法。从这个简单的例子里,我们可以得出:

原型对象的用途是为每个实例对象存储共享的方法和属性,它仅仅是一个普通对象而已。并且所有的实例是共享同一个原型对象,因此有别于实例方法或属性,原型对象仅有一份。所有就会有如下等式成立:

person.say == new Person().say

可能我们也会这么写

 function Person () {
 this.name = 'John';
 }
 var person = new Person();
 Person.prototype = {
 say: function() {
  console.log('Hello,' + this.name);
 }
 };
 person.say();//person.say is not a function

很不幸,person.say方法没有找到,所以报错了。其实这样写的初衷是好的:因为如果想在原型对象上添加更多的属性和方法,我们不得不每次都要写一行Person.prototype,还不如提炼成一个Object来的直接。但是此例子巧就巧在构造实例对象操作是在添加原型方法之前,这样就会造成一个问题:

当var person = new Person()时,Person.prototype为:Person {}(当然了,内部还有constructor属性),即Person.prototype指向一个空的对象{}。而对于实例person而言,其内部有一个原型链指针proto,该指针指向了Person.prototype指向的对象,即{}。接下来重置了Person的原型对象,使其指向了另外一个对象,即

Object {say: function},

这时person.proto的指向还是没有变,它指向的{}对象里面是没有say方法的,因为报错。

从这个现象我们可以得出:

在js中,对象在调用一个方法时会首先在自身里寻找是否有该方法,若没有,则去原型链上去寻找,依次层层递进,这里的原型链就是实例对象的__proto__属性。

若想让上述例子成功运行,最简单有效的方法就是交换构造对象和重置原型对象的顺序,即:

 function Person () {
 this.name = 'John';
 }
 Person.prototype = {
 say: function() {
  console.log('Hello,' + this.name);
 }
 };
 var person = new Person();
 person.say();//person.say is not a function

一张图让你秒懂原型链

其实,只需要明白原型对象的结构即可:

 Function.prototype = {
 constructor : Function,
 __proto__ : parent prototype,
 some prototype properties: ...
 };

总结:函数的原型对象constructor默认指向函数本身,原型对象除了有原型属性外,为了实现继承,还有一个原型链指针__proto__,该指针指向上一层的原型对象,而上一层的原型对象的结构依然类似,这样利用__proto__一直指向Object的原型对象上,而Object的原型对象用Object.__proto__ = null表示原型链的最顶端,如此变形成了javascript的原型链继承,同时也解释了为什么所有的javascript对象都具有Object的基本方法。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# js原型对象  # js原型链  # JS原型、原型链深入理解  # js原型链原理看图说明  # JS继承--原型链继承和类式继承  # 小白谈谈对JS原型链的理解  # JavaScript中原型和原型链详解  # JS原型与原型链的深入理解  # 深入理解javascript原型链和继承  # 浅谈JS原型对象和原型链  # JS原型链怎么理解  # js原型与原型链万文总结详解(一文搞懂原型链!)  # 就会  # 让你  # 我们可以  # 最简单  # 让我  # 是在  # 成了  # 也会  # 那就  # 一句  # 不懂  # 问我  # 错了  # 受益匪浅  # 还有一个  # 仅仅是  # 使其  # 只需要  # 书中  # 一个问题 


相关文章: 南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  网站制作公司,橙子建站是合法的吗?  名字制作网站免费,所有小说网站的名字?  定制建站策划方案_专业建站与网站建设方案一站式指南  长沙企业网站制作哪家好,长沙水业集团官方网站?  建站之星24小时客服电话如何获取?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何通过可视化优化提升建站效果?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  制作网站的基本流程,设计网站的软件是什么?  c# 在高并发场景下,委托和接口调用的性能对比  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  建站之星北京办公室:智能建站系统与小程序生成方案解析  建站主机选虚拟主机还是云服务器更好?  北京制作网站的公司,北京铁路集团官方网站?  黑客入侵网站服务器的常见手法有哪些?  学校为何禁止电信移动建设网站?  建站主机是否属于云主机类型?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  香港服务器租用费用高吗?如何避免常见误区?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  寿县云建站:智能SEO优化与多行业模板快速上线指南  如何用PHP快速搭建CMS系统?  成都网站制作报价公司,成都工业用气开户费用?  建站之星图片链接生成指南:自助建站与智能设计教程  实例解析Array和String方法  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  高防服务器租用如何选择配置与防御等级?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  建站之星如何快速生成多端适配网站?  宝塔新建站点报错如何解决?  制作证书网站有哪些,全国城建培训中心证书查询官网?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何制作算命网站,怎么注册算命网站?  Thinkphp 中 distinct 的用法解析  专业公司网站制作公司,用什么语言做企业网站比较好?  制作营销网站公司,淘特是干什么用的?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  建站之星在线版空间:自助建站+智能模板一键生成方案  北京网站制作公司哪家好一点,北京租房网站有哪些?  网站制作说明怎么写,简述网页设计的流程并说明原因?  如何快速登录WAP自助建站平台?  建站主机选购指南与交易推荐:核心配置解析  nginx修改上传文件大小限制的方法  如何自定义建站之星网站的导航菜单样式? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。