[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自定义事件介绍
Aug 29 Javascript
JavaScript实现的MD5算法完整实例
Feb 02 Javascript
seajs学习教程之基础篇
Oct 20 Javascript
AngularJS变量及过滤器Filter用法分析
Nov 22 Javascript
基于JavaScript实现右键菜单和拖拽功能
Nov 28 Javascript
jquery.form.js异步提交表单详解
Apr 25 jQuery
微信JSSDK调用微信扫一扫功能的方法
Jul 25 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
Oct 25 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
Oct 10 jQuery
vue中轮训器的使用
Jan 27 Javascript
详解关于html,css,js三者的加载顺序问题
Apr 10 Javascript
解决antd的Form组件setFieldsValue的警告问题
Oct 29 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
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
PHP 读取和修改大文件的某行内容的代码
2009/10/30 PHP
php显示时间常用方法小结
2015/06/05 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
JavaScript验证图片类型(扩展名)的函数分享
2014/05/05 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
python学生管理系统代码实现
2020/04/05 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
Python 做曲线拟合和求积分的方法
2018/12/29 Python
python实现机器人卡牌
2019/10/06 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
1688平价精选商城:阿里集团旗下,工厂出厂价格直销
2017/04/24 全球购物
Bodum官网:咖啡和茶壶、玻璃器皿、厨房电器等
2018/08/01 全球购物
欧洲著名的二手奢侈品网站:Vestiaire Collective
2020/03/07 全球购物
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
大学生党员自我批评
2014/02/14 职场文书
青春寄语大全
2014/04/09 职场文书
学期评语大全
2014/04/30 职场文书
2015年除四害工作总结
2015/07/23 职场文书
电台广播稿范文
2015/08/19 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL
基于Redis结合SpringBoot的秒杀案例详解
2021/10/05 Redis
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis