[js高手之路]图解javascript的原型(prototype)对象,原型链实例


Posted in Javascript onAugust 28, 2017

我们通过原型方式,解决了多个实例的方法共享问题,接下来,我们就来搞清楚原型(prototype),原型链的来龙去脉。

function CreateObj(uName) {
   this.userName = uName;
  }
  CreateObj.prototype.showUserName = function(){
   return this.userName;
  }
  var obj1 = new CreateObj('ghostwu');
  var obj2 = new CreateObj('卫庄');

[js高手之路]图解javascript的原型(prototype)对象,原型链实例

1,每个函数都有一个原型属性(prototype) , 这个属性是一个指针,指向构造函数的原型对象( CreateObj.prototype), 如上图中的第1根绿色的线

2,在默认情况下,所有原型对象都会自动获得一个constructor属性,该属性的作用上文已经解释过,该属性包含一个指向prototype属性所在的函数,如上图的第2根绿色的线

3,所有的实例( 通过构造函数new出来的, 原型对象[ 如CreateObj.prototype, 上图我还没有画出来]等 )都包含一个隐式原型(__proto__),该指针指向实例的构造函数的原型对象,

如上图中的第3根线和第4根线. obj1的构造函数是CreateObj, CreateObj的原型对象是CreateObj.prototype, obj2同理,所以:

obj1.__proto__ === CreateObj.prototype //true

obj2.__proto__ === CreateObj.prototype //true

4,写在构造函数中, 为this赋值的属性和方法, 在画图的过程中,把他们画在对象上面,如userName这个是给对象赋值的属性,所以在obj1和obj2这两个对象上都会存在一个属性userName

5,写在原型对象上的方法或者属性,应该把他们画在原型对象上,如

CreateObj.prototype.showUserName = function(){
return this.userName;
}

showUserName这个方法就要画在图中CreateObj.prototype上面

6,当一个对象访问属性和方法的时候,他的访问规则叫(就近原则), 规则如下:

当实例上面,存在属性或者方法时,直接用实例上面的,

如果实例上面不存在属性和方法,就会沿着实例的__proto__指针指向的原型对象继续往上查找,如果找不到,值就是undefined.

console.log( obj1.showUserName() ); //ghostwu
console.log( obj2.showUserName() ); //卫庄

在obj1,obj2上面是不存在showUserName这个方法的,所以会顺着__proto__查找到CreateObj.prototype原型对象上的showUserName方法

如果,把CreateObj.prototype原型对象上的showUserName注释掉,那么obj1.showUserName和obj2.showUserName就会报错

// CreateObj.prototype.showUserName = function(){
// return this.userName;
// }
function CreateObj(uName) {
   this.userName = uName;
   this.showUserName = function(){
    return '100';
   }
  }
  CreateObj.prototype.showUserName = function(){
   return this.userName;
  }

  var obj1 = new CreateObj('ghostwu');
  var obj2 = new CreateObj('卫庄');

  console.log( obj1.showUserName() ); //100
  console.log( obj2.showUserName() ); //100

如果在构造函数中为this添加一个showUserName方法, 那么obj1和obj2就会直接调用this上面的,因为这两个方法会被画在图中的实例上,所以:

console.log( obj1.showUserName === obj2.showUserName ); //false

现在,你应该能明白,把属性和方法写在构造函数的原型对象(prototype)上之后,能实现多个实例属性和方法的共享的原理了吧

什么是原型链?

在前面,我有说过,所有的实例(包括原型对象)都有一个隐式原型__proto__,那么CreateObj.prototype这个原型对象,他的__proto__指向谁呢?

function CreateObj(uName) {
   this.userName = uName;
   this.showUserName = function () {
    return '100';
   }
  }
  CreateObj.prototype.showUserName = function () {
   return this.userName;
  }

  console.log( CreateObj.prototype.__proto__ ); //指向Object.prototype
  console.log( CreateObj.prototype.__proto__ === Object.prototype ); //true

[js高手之路]图解javascript的原型(prototype)对象,原型链实例

CreateObj.prototype.__proto__指向的是Object.prototype, 通过 全等运算符 (===) 测试之后为true

Object.prototype.__proto__ 指向的是NULL

这就是原型链,通过隐式原型把一些构造函数层层的串起来,通过上面这个图,就知道,为什么自定义的对象能调用toString, valueOf,等方法了吧?

因为所有的对象都是继承自Object.

以上这篇[js高手之路]图解javascript的原型(prototype)对象,原型链实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
关于Aptana Studio生成自动备份文件的解决办法
Dec 23 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
Aug 28 Javascript
33个优秀的 jQuery 图片展示插件分享
Mar 14 Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
Jan 17 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
Oct 23 Javascript
Javasipt:操作radio标签详解
Dec 30 Javascript
jquery处理json对象
Nov 03 Javascript
微信小程序 教程之模板
Oct 18 Javascript
canvas绘制爱心的几种方法总结(推荐)
Oct 31 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
Aug 12 Javascript
JQuery实现折叠式菜单的详细代码
Jun 03 jQuery
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
Nov 03 Javascript
js制作简单的音乐播放器的示例代码
Aug 28 #Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
Aug 28 #Javascript
jQuery菜单实例(全选,反选,取消)
Aug 28 #jQuery
[js高手之路]原型式继承与寄生式继承详解
Aug 28 #Javascript
[js高手之路]寄生组合式继承的优势详解
Aug 28 #Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
Aug 28 #Javascript
js排序与重组的实例讲解
Aug 28 #Javascript
You might like
php常用文件操作函数汇总
2014/11/22 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
jquery插件制作简单示例说明
2012/02/03 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
javascript框架设计读书笔记之数组的扩展与修复
2014/12/02 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
基于JavaScript操作DOM常用的API小结
2015/12/01 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
Vue.js第四天学习笔记(组件)
2016/12/02 Javascript
vue.js中过滤器的使用教程
2017/06/08 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
2019/04/22 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
2019/09/26 Javascript
Python入门篇之列表和元组
2014/10/17 Python
python读取word文档的方法
2015/05/09 Python
python3.0 模拟用户登录,三次错误锁定的实例
2017/11/02 Python
Python排序搜索基本算法之归并排序实例分析
2017/12/08 Python
python中yaml配置文件模块的使用详解
2018/04/27 Python
python ChainMap 合并字典的实现步骤
2019/06/11 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
平面设计师工作职责范文
2013/12/03 职场文书
激励员工的口号
2014/06/16 职场文书
大学生工作自荐书
2014/06/16 职场文书
延安红色之旅心得体会
2014/10/07 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
给老婆的检讨书
2015/01/27 职场文书
民事起诉状范文
2015/05/19 职场文书
导游词之广东佛山(南风古灶)
2019/09/24 职场文书