[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 相关文章推荐
枚举JavaScript对象的函数
Dec 22 Javascript
flexigrid 类似ext grid的JS表格代码
Jul 17 Javascript
基于jquery的一行代码轻松实现拖动效果
Dec 28 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
Jan 08 Javascript
JS模拟按钮点击功能的方法
Dec 22 Javascript
前端设计师们最常用的JS代码汇总
Sep 25 Javascript
express文件上传中间件Multer详解
Oct 24 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
Feb 12 Javascript
构建大型 Vue.js 项目的10条建议(小结)
Nov 14 Javascript
Vue-axios-post数据后端接不到问题解决
Jan 09 Javascript
js实现坦克大战游戏
Feb 24 Javascript
完美解决vue 中多个echarts图表自适应的问题
Jul 19 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开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
php变量作用域的深入解析
2013/06/03 PHP
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
JS获取dom 对象 ajax操作 读写cookie函数
2009/11/18 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
python实现2014火车票查询代码分享
2014/01/10 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
Python正则表达式和re库知识点总结
2019/02/11 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
世界上最大的在线学习和教学市场:Udemy
2017/11/08 全球购物
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
中学生学习生活的自我评价
2013/10/26 职场文书
20岁生日感言
2014/01/13 职场文书
碧霞祠导游词
2015/02/09 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
人民币符号
2022/02/17 杂记
python中的sys模块和os模块
2022/03/20 Python
Redis实现订单过期删除的方法步骤
2022/06/05 Redis