由于在原型中查找值的过程是一次搜索,因此我们对原型对象所做的任何修改都能够立即从实例上反映出来,即使是先创建了实例后修改原型也照样如此。

如下示例:

var friend = new Person();
Person.prototype.sayHi = function() {alert("hi") ;
};
friend.sayHi();    // "hi"

以上代码先创建了Person的一个实例, 并将其保存在friend中。然后,下一条语句在Person.prototype中添加了一个方法sayHi()。即使friend实例是在添加新方法之前创建的,但它仍然可以访问这个新方法。

其原因可以归结为实例与原型之间的松散连接关系。当我们调用friend.sayHi()时,首先会在实例中搜索名为sayHi 的属性,在没找到的情况下,会继续搜索原型。因为实例与原型之间的连接只不过是一个指针, 而非一个副本, 因此就可以在原型中找到新的sayHi属性并返回保存在那里的函数。

尽管可以随时为原型添加属性和方法,并且修改能够立即在所有对象实例中反映出来,但如果是重写整个原型对象,那么情况就不一样了。我们知道, 调用构造函数时会为实例添加一个指向最初原型的[[Prototype]]指针, 而把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系

请记住:实例中的指针仅指向原型,而不指向构造函数。看下面的例子:

function Person(){}var friend = new Person();Person.prototype = {constructor: Person,name : "Nicholas" ,age : 29,job : "Software Engineer" ,sayName : function () {alert (this .name);}
};friend.sayName();    //error

在这个例子中,先创建了Person 的一个实例,然后又重写了其原型对象。然后在调用friend.sayName()时发生了错误,因为friend指向的原型中不包含以该名字命名的属性。

原因看下图:

根据上图中重写原型对象前后的对比可以看出,重写原型对象切断了现有原型与任何之前已经存在的对象实例之间的联系;它们引用的仍是最初的原型

转自:https://www.cnblogs.com/weiyalin/p/9405052.html

转载于:https://www.cnblogs.com/lishanlei/p/9452235.html

JavaScript 原型链学习(二)原型的动态性相关推荐

  1. 真丶深入理解 JavaScript 原型和原型链(二):原型和原型链

    原文地址: https://www.jeremyjone.com/745/,转载请注明. 上一篇文章已经总结了关于原型的两个属性,那么接下来所有原型和原型链,乃至后面的继承,都与这两个属性有关系. 原 ...

  2. 前端面试知识点总结JavaScript基础之原型和原型链(二)

    一.JavaScript基础 原型和原型链 1.理解原型设计模式以及JavaScript中的原型规则 设计模式 1.工厂模式:在函数内建立一个对象,给对象赋予属性及方法再将对象返回设计模式. func ...

  3. JS学习笔记 原型链和利用原型实现继承

    原型链 原型链是一种关系,实例对象和原型对象之间的关系,关系是通过原型(__proto__)来联系的 实例对象中有__proto__,是对象,叫原型,不是标准的属性,浏览器使用,并且有的游览器不支持 ...

  4. 轻松学习JavaScript十七:JavaScript的BOM学习(二)

            JavaScript计时事件 通过使用JavaScript中的BOM对象中的window对象的两个方法就是setTimeout()方法和claerTimeout()方法,我们 有能力作 ...

  5. JavaScript之面向对象学习四原型对象的动态性

    1.由于在原型中查找值的过程是一次搜索,因此我们对原型对象所做的任何修改都能够立即从实例上反映出来---即便是先创建了实例后修改原型也是如此.代码如下: function Person(){ } va ...

  6. JavaScript高级程序设计学习(二)之基本概念

    任何语言的核心都必然会描述这门语言基本的工作原理.而描述的内容通常都要涉及这门语 言的语法.操作符.数据类型.内置功能等用于构建复杂解决方案的基本概念.如前所述, ECMA-262通过叫做 ECMAS ...

  7. 学习面向对象的Javascript的第一步就是要搞清楚两个东西:原型链和作用域链

    前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型. 虽然这经常被当作是 JavaScript 的缺点被提及,其实基于原型的继承模型比传统的类继承还要强大.实 ...

  8. JavaScript 设计模式学习第五篇-继承与原型链

    JavaScript 是一种灵活的语言,兼容并包含面向对象风格.函数式风格等编程风格.我们知道面向对象风格有三大特性和六大原则,三大特性是封装.继承.多态,六大原则是单一职责原则(SRP).开放封闭原 ...

  9. JavaScript——原型/原型链中的顶层对象(图解)

    本篇需要提前了解的知识储备:原型和原型链,以下仅概要介绍,不作详细讲解. 详细学习可参考: JavaScript--面向对象(封装):https://blog.csdn.net/qq_29493173 ...

最新文章

  1. redis必杀高级:性能测试
  2. java单点登录强制下线_实现单点登录并强制对方下线
  3. 迄今最详细宇宙模型建成
  4. mysql适配器_MySQL适配器PyMySQL详解
  5. UA OPTI512R 傅立叶光学导论15 2-D Fourier变换与Hankel变换
  6. 简易zlib库解压缩函数封装
  7. “天猫化”的考拉,还是考拉吗?
  8. 如何使用CSDN- Markdown编辑器(给自己看的)
  9. Android香露刀之SeekBar之双管齐下
  10. 莫烦Pytorch神经网络第五章代码修改
  11. 信息安全工程师笔记-网络安全主动防御技术与应用
  12. 《Linux KVM虚拟化架构实战指南》——导读
  13. MTKP60 vs MSM 660
  14. ftp 上传档案到主机 OMVS
  15. Chrome 内存和CPU消耗量双料冠军
  16. 建站之星检测不到mysql_建站之星安装,建站之星安装教程 | 帮助信息-动天数据...
  17. 电脑重装系统后Win11底部任务栏大小调整方法
  18. 计算机上面的按键作用,鼠标侧键有什么用 鼠标上各按键的功能是什么
  19. echart折线图信息配置及点击事件
  20. JS中如何阻止事件的传播

热门文章

  1. Activiti工作流之实现一个简单的流程审批
  2. python init方法是不是私有方法_为什么Python的“私有”方法实际上不是私有的?...
  3. 【教程】Linux 下软 RAID 实现方案!!
  4. 精彩回顾 | Serverless Developer Meetup 12.04 深圳站
  5. Java控制台如何输入一行、多行?
  6. php编程用空格,shell 编程中空格的使用方法
  7. vue 不识别svg_vue中引用svg,vue引入svg不显示,vue引用svg配置,vue3.0+ts如何配置svg...
  8. js生日计算年龄_JS根据生日算年龄的方法
  9. 爱奇艺android投屏,手机爱奇艺APP怎么将视频投屏上笔记本电脑?
  10. android+canvas+图片,android 开发 View _12_ 用Canvas 绘制一张图片(博客中演示用Canvas画验证码图片)...