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

function Person(){
}
var friend=new Person();
Person.prototype.sayHello=function(){alert("Hello");
}
friend.sayHello(); //输出:Hello

上面这段代码先创建了Person的一个实例,并将其保存在friend中。接着下一个代码块在Person.prototype(Person的原型属性对对象)中添加了一个方法sayHello();

根据输出,我们发现即使friend实例是在添加新方法之前创建的,但它任然可以访问这个新方法。

其原因可以归结为实例与原型之间的松散连接关系,当我们调用friend.sayHello()时,首先会在实例中搜索名为sayHello的属性方法,如果实例属性中没有,则会继续去搜索原型。而原型与实例之间是通过[[prototype]]指针相连接的(实例通过[[prototype]]指针指向原型属性对象来调用原型中的方法和属性),正因为[[prototype]]是一个指针,并不是Person的副本,所以即使修改(添加)原型的方法在创建完实例之后,该实例任然可以访问完成修改之后的原型对象!

2、尽管利用上面所说的实例与连接的松散连接关系,我们可以随时为原型添加属性和方法,并且修改能够在所有的实例中反映出来。

但是如果重写整个原型对象,那么情况就不一样了,在前面的随笔中曾说过,当调用构造函数创建一个对象实例时JS会为实例添加一个指向最初原型(也就是Person.prototype)的[[prototype]]指针,而像下面的代码中那样,把原型修改成另外一个对象,并不能改变实例中的[[prototype]]指针的值(说明白点,就是实例还是指向最初原型);

注意:实例中的[[prototype]]仅指向最初原型;

function Person(){
}
var friend=new Person();
Person.prototype={constructor:Person,name:"张三",age:22,sayHello:function(){alert("Hello James");}
};
friend.sayHello(); //error 控制台报错!

从上面的图我们可以看出,重写原型对象之后,并没有是对象实例的[[prototype]]指针的值发生改变,它还是指向最初的原型对象。

JavaScript之面向对象学习四原型对象的动态性相关推荐

  1. JavaScript是面向对象还是基于对象

    与其他语言相比,JavaScript中的对象总是显得不是那么合群. 我们在学习JavaScript面向对象时,往往也会有疑惑: 为什么JavaScript知道ES6才有对象的概念,但是却没有像其他语言 ...

  2. javascript 之 面向对象【理解对象】

    第五版本 6.1.1  属性类型      1/数据属性 :包含有数据值的问题.有内部有特性和属性,是为了实现javaScript引擎用的,在javaScript中不能直接访问  [[Configur ...

  3. JavaScript之面向对象学习三原型语法升级

    1.到目前为止,我们是时候分析下前面的使用原型语法来定义对象有哪些不足的地方,代码如下: function Person(){}Person.prototype.name="张三" ...

  4. JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象...

    一.仔细分析前面的原型模式创建对象的方法,发现原型模式创建对象,也存在一些问题,如下: 1.它省略了为构造函数传递初始化参数这个环节,结果所有实例在默认的情况下都将取得相同的属性值,这还不是最大的问题 ...

  5. muduo网络库学习(一)对io复用的封装Poller,面向对象与基于对象

    高效并发的网络框架大多离不开io多路复用函数,Linux下有三种 select poll epoll 关于三者的区别可以参考 linux网络编程-–几种服务器模型及io多路复用函数 前段时间看Libe ...

  6. Delphi面向对象学习随笔一:类与对象的关系

    Delphi面向对象学习随笔一:类与对象的关系 作者:巴哈姆特 http://www.cnpack.org (转载请注明出处并保持完整) 工作几年了,总想做点总结,于是有了这篇东西,叫随笔吧呵     ...

  7. javascript学习之对象基础

    2019独角兽企业重金招聘Python工程师标准>>> javascript学习之对象基础 面向对象语言 面向对象语言需要向开发者提供四种基本能力 封装:把相关信息(数据和方法)存储 ...

  8. JavaScript的基础学习篇

    在学习JavaScript之前,我们应该先认识一下什么是脚本语言(Scripting Language)? 脚本语言就是一种简单的程序.在运行之前不需要先进行编译,所有的代码都是在客户程序中直接被执行 ...

  9. JavaScript 使用面向对象的技术创建高级 Web 应用程序

    最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 J ...

最新文章

  1. 2020上半年收集到的优质AI文章 – AI+和+AI
  2. Eclipse高版本无法兼容FatJar的问题解决
  3. QT的QFormBuilder类的使用
  4. Linux下安装Redis并添加PHP扩展(自己测试了没有问题)
  5. PIE SDK剔除栅格块算法
  6. poj2337 欧拉路径
  7. shell 文件路径有空格_Python学习第57课-shell入门之基本简单命令(一)
  8. 疑似华为Mate 30 Pro上手视频曝光 看完更想买了!
  9. 修改个人信息 python_python函数练习——个人信息修改
  10. XUbuntu20.04开机logo定制,主题修改启动背景
  11. k-近邻算法 ---sklearn
  12. 基于Flash的开源网页播放器使用方法(FlowPlayer/AdobePlayer)
  13. 低代码开发之开源数据可视化分析平台datagear
  14. 关于野火mini led的学习
  15. 如何用三角形拼成一个正方形
  16. Android常用控件-02
  17. D-OJ刷题日记:一元多项式的运算 题目编号:463
  18. android 触摸屏部分失灵,触摸屏失灵修复小技巧
  19. Switch 链接OBS Studio输出声音(无延迟)的方法
  20. 点赞动画,鼠标点击动画

热门文章

  1. 20万数据 sql 快还是 java快?_H2数据库学习(一)
  2. python模拟键盘输入_python模拟键盘输入的问题
  3. php 工厂模式 使用场景,PHP设计模式之工厂模式
  4. oracle 9i sql_id,Oracle9i增添 wm_concat函数(转)
  5. hibernate4调用mysql存储过程_hibernate调用存储过程
  6. matlab程序怎么改,修改matlab程序
  7. 前端JavaScript基础知识点
  8. 一段树状无限制级代码
  9. 自己写的TimeHelper javal时间工具
  10. java面试题六 float变量合法声明