[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 相关文章推荐
鼠标经过的文本框textbox变色
May 21 Javascript
js 操作符实例代码
Oct 24 Javascript
Exitjs获取DataView中图片文件名
Nov 26 Javascript
网页中可关闭的漂浮窗口实现可自行调节
Aug 20 Javascript
原生js ActiveXObject获取execl里面的值
Nov 01 Javascript
原生js和jquery实现图片轮播淡入淡出效果
Apr 23 Javascript
jQuery+HTML5实现图片上传前预览效果
Aug 20 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
Sep 26 Javascript
详解如何实现一个简单的 vuex
Feb 10 Javascript
浅谈Vue的响应式原理
May 30 Javascript
如何基于filter实现网站整体变灰功能
Apr 17 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
Sep 24 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中this,self,parent的区别详解
2013/06/08 PHP
解析php5配置使用pdo
2013/07/03 PHP
30个php操作redis常用方法代码例子
2014/07/05 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
PHP可变变量学习小结
2015/11/29 PHP
php PDO异常处理详解
2016/11/20 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
js的flv视频播放器插件使用方法
2015/06/23 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
Parcel 打包示例(React HelloWorld)
2018/01/16 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
深入Python解释器理解Python中的字节码
2015/04/01 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
Python random模块用法解析及简单示例
2017/12/18 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
python读取文本中的坐标方法
2018/10/14 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
Django REST framework 视图和路由详解
2019/07/19 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
Python响应对象text属性乱码解决方案
2020/03/31 Python
使用Pycharm分段执行代码
2020/04/15 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
Python实现微信表情包炸群功能
2021/01/28 Python
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
会计与审计专业大专生求职信
2013/10/03 职场文书
读书演讲主持词
2014/03/18 职场文书
质量承诺书怎么写
2014/05/24 职场文书
公司授权委托书样本
2014/09/15 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
Win Server2016远程桌面如何允许多用户同时登录
2022/06/10 Servers