最近在看 JavaScript忍者秘籍 这本书的时候,再加上最近遇到的关于原型、原型链的面试题,所以萌生了要把这些知识梳理一遍的想法,所以以下是我自己对原型、原型链的看法

什么是原型

提到原型,我们可能都会想到与对象有关的东西,但其实,原型是与函数才是密切相关的。每当我们创建一个函数,都会有一个指向该函数的原型对象的指针prototype,然后该原型对象上又有一个指向该函数的指针constructor,在这里,如果我们这个函数是一个构造函数,那么我们每实例化一个对象,该对象都会有一个指向该构造函数的原型对象的指针_proto_,那么我就以一个小的例子来讲解一下原型对象,构造函数与实例的关系。

function Ninja(){
this.swung = true;
this.swingSword = function(){
return !this.swung;
}
}
Ninja.prototype.swingSword = function(){
return this.swung;
};
var ninja = new Ninja();

从图中可以看出,通过构造函数Ninja()创建了一个对象,并且这个对象的引用是一个变量ninja,然后该构造函数,又有一个指向它的原型对象的属性prototype


谈到原型,接下来就是原型对象的几个知识点。

  • 如果给对象实例添加了一个与原型对象中的某个同名属性,该对象实例上的这个属性会覆盖原型对象上的属性,我们可以通过代码来演示:
function Ninja(){
this.swung = true;
this.swingSword = function(){
return !this.swung;
}
}
Ninja.prototype.swingSword = function(){
return this.swung;
};
var ninja = new Ninja();
ninja.swingSword();//false

因为每次访问实例中的属性是,都是一个向上查找的过程,会先从实例对象上查找有无这个属性,如果有,就返回这个属性,如果没有,就会继续往它的原型对象上找,一层层往上寻找,如果没有,就返回undefined。

  • 如果我们先实例化了一个对象实例,然后再改变了它的原型对象,这个改变会反映在这个对象实例上,因为原型对象上的改变会实时反应在每一个对象实例上,这也是原型对象的重要特性之一,代码演示实例如下:
function Ninja(){
this.swung = true;
}
Ninja.prototype.swingSword = function(){
return this.swung;
};
var ninja = new Ninja();
Ninja,prototype.swingSword = function(){
return !this.swung;
}
ninja.swingSword();//false;

什么是原型链

原型链与javascript中的继承密切相关,可以说,继承是通过原型链来实现的。原型链可以理解为一个对象的实例是另一个对象的原型,然后另一个对象的实例又是另一个对象的原型,依次类推形成的一个链式结构

所以一般实现继承的方式是:将父类的实例作为子类的原型,用下面这个例子来讲解一下

function Person(){};
Person.prototype.dance = function(){};
function Ninja(){};
Ninja.prototype = new Person();
var ninja = new Ninja();

从图片可以看出,让Person的一个实例作为子类Ninja对象的原型,这样,Ninja就继承了Person上的所有属性和方法,包括构造函数上的还有原型上的,这就是原型链实现继承的方法。

那么为什么我们不直接将父类的原型对象直接赋给子类的原型对象呢,那是因为如果我们这样做的话,对子类原型对象的改变,将会直接影响到了父类中的原型对象,这是一个不可取的方法。

JS进阶系列之原型、原型链的更多相关文章

  1. 【 D3.js 进阶系列 】 进阶总结

    进阶系列的文章从去年10月开始写的,晃眼又是4个多月了,想在年前总结一下. 首先恭祝大家新年快乐.今年是羊年吧.前段时间和朋友聊天,聊到十二生肖里为什么没猫,我张口就道:不是因为十二生肖开会的时候猫迟 ...

  2. 【 D3.js 进阶系列 — 4.0 】 绘制箭头

    转自:http://www.ourd3js.com/wordpress/?p=660 [ D3.js 进阶系列 — 4.0 ] 绘制箭头 发表于2014/12/08 在 SVG 绘制区域中作图,在绘制 ...

  3. JS进阶系列之作用域链

    在之前写的进阶系列里面,提到了执行上下文在创建阶段,要创建变量对象.确定作用域链还有确定this的指向,本次将重点讲解一下作用域链. JavaScript代码的执行过程 在讲解作用域链之前,首先了解一 ...

  4. 【 D3.js 进阶系列 — 1.1 】 其它表格文件的读取

    CSV 表格文件是以逗号作为单元分隔符的,其他还有以制表符 Tab 作为单元分隔符的 TSV 文件,还有人为定义的其他分隔符的表格文件.本文将说明在 D3 中怎样读取它们. 1. TSV 表格文件是什 ...

  5. 【 D3.js 进阶系列 — 1.2 】 读取 CSV 文件时乱码的解决方法

    在 D3 中使用 d3.csv 读取 CSV 文件时,有时会出现乱码问题. 怎么解决呢? 1. 乱码问题 使用 d3.csv 读取 xxx.csv 文件时.假设 xxx.csv 文件使用的是 UTF- ...

  6. js基础系列之【原型和原型链】

    声明:形成本文的出发点仅仅是个人总结记录,避免遗忘,并非详实的教程:文中引用了经过个人加工的其它作者的内容,并非原创.学海无涯 引入问题 一般我们是这样写的: (需求驱动技术,疑问驱动进步) // 构 ...

  7. JS进阶之---作用域,作用域链,闭包

    一.作用域: 在JavaScript中,我们可以将作用域定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称进行变量查找.这里的标识符,指的是变量名或者函数名. Ja ...

  8. JS进阶系列之内存空间

    也许很多人像我一样,觉得JS有垃圾回收机制,内存就可以不管了,以至于在全局作用域下定义了很多变量,自以为JS会自动回收,直到最近,看了阮一峰老师,关于javascript内存泄漏的文章时,才发现自己写 ...

  9. 【 D3.js 进阶系列 — 6.1 】 缩放的应用(Zoom)

    缩放(Zoom)是另一种重要的可视化操作,主要是使用鼠标的滚轮进行. 1. zoom 的定义 缩放是由 d3.behavior.zoom() 定义的. var zoom = d3.behavior.z ...

随机推荐

  1. JavaScript实现计时器

    var myVar=setInterval(function(){myTimer()},1000); function myTimer() { var d = new Date(); document ...

  2. 带着问题学习openstack

    1.为什么要引入nova conductor, nova conductor 为什么接管了nova api RPC调用nova scheduler 的任务? nova-conductor:与数据库交互 ...

  3. CentOS6中OpenMP的运行时间或运行性能分析

    OpenMp作为单机多核心共享内存并行编程的开发工具,具有编码简洁等,容易上手等特点. 关于OpenMP的入门,博主饮水思源(见参考资料)有了深入浅出,循序渐进的分析.做并行开发,做性能分析是永远逃避 ...

  4. warning:ISO C90 forbids mixed declarations and code

    warning:ISO C90 forbids mixed declarations and code 变量定义之前不论什么一条非变量定义的语句(重视:语句是会带分号的)都会引起这个警告! 将非变量的 ...

  5. 50个国内外最棒的C/C++源码站点分享

    C/C++是最基本的编程语言.这里列出了50名优秀站点和网页清单,这些站点提供c/c++源码.这份清单提供了源码的链接以及它们的小说明.我已 尽力包含最佳的C/C++源码的站点.这不是一个完整的清单, ...

  6. css笔记--用户界面样式

    1.系统字体,系统颜色.根据关键字设置为系统某方面相同的字体和颜色 2.光标:鼠标移入时光标的不同显示方法,有十字键,手型:cursor:pointer;cursor:hand;要按顺序,cursor ...

  7. R语言文本挖掘+词云显示(jiebaR包+wordcloud2包)

    利用2018年政府工作报告的例子向大家展示一下R语言如何进行文本挖掘的~用到的包有jiebaR和wordcloud2. 1.安装并加载jiebaR install.packages("jie ...

  8. asp.net页面中实现如果图片不存在则显示默认图片

    onerror="this.src='/SysAdmin/images/noTouXiang.jpg';"

  9. SpringIDE的安装

    要安装SpringIDE,需要先知道当前eclipse的版本,打开Eclipse,Help -> About Eclipse 然后去 http://spring.io/tools/sts/all ...

  10. 2017-2018-1 20155230 mypwd实现

    mypwd实现 每个文件夹都有以".",".."为名的文件.首先记录"."所拥有的i-节点号,然后使用chdir向上进入父目录查找含有刚记录 ...