[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 二维数组
Nov 26 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
Dec 30 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 Javascript
javascript中hasOwnProperty() 方法使用指南
Mar 09 Javascript
javascript学习总结之js使用技巧
Sep 02 Javascript
基于Javascript实现返回顶部按钮
Feb 29 Javascript
jQuery仿IOS弹出框插件
Feb 18 Javascript
详解vue跨组件通信的几种方法
Jun 15 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
Oct 27 jQuery
详解Vue组件之间通信的七种方式
Apr 14 Javascript
p5.js码绘“跳动的小正方形”的实现代码
Oct 22 Javascript
在Vue中使用mockjs代码实例
Nov 25 Vue.js
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从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
xtree.js 代码
2007/03/13 Javascript
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
ASP.NET中AJAX 调用实例代码
2012/05/03 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
python实现的阳历转阴历(农历)算法
2014/04/25 Python
在Python上基于Markov链生成伪随机文本的教程
2015/04/17 Python
tensorflow输出权重值和偏差的方法
2018/02/10 Python
Python标准库shutil用法实例详解
2018/08/13 Python
详解Python用户登录接口的方法
2019/04/17 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
Jones Bootmaker官网:优质靴子和鞋子在线
2020/11/30 全球购物
新媒传信软件测试面试题
2013/02/24 面试题
Python的两道面试题
2013/06/29 面试题
外贸主管求职简历的自我评价
2013/10/23 职场文书
企业内控岗位的职责
2014/02/07 职场文书
竞选部长演讲稿
2014/04/26 职场文书
单位消防安全责任书
2014/07/23 职场文书
学党史心得体会
2014/09/05 职场文书
竞选大队干部演讲稿
2014/09/11 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL
python 标准库原理与用法详解之os.path篇
2021/10/24 Python
Vue router配置与使用分析讲解
2022/12/24 Vue.js