[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 相关文章推荐
jQuery实现简单的间隔向上滚动效果
Mar 09 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
Jan 13 Javascript
window.onload绑定多个事件的两种解决方案
May 15 Javascript
微信小程序 欢迎界面开发的实例详解
Nov 30 Javascript
微信小程序 生命周期函数详解
May 24 Javascript
vue脚手架中配置Sass的方法
Jan 04 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
Feb 08 Javascript
Es6 Generator函数详细解析
Feb 24 Javascript
解决vue select当前value没有更新到vue对象属性的问题
Aug 30 Javascript
详解小程序之简单登录注册表单验证
May 13 Javascript
微信小程序实现多选框功能的实例代码
Jun 24 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
Dec 01 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
当海贼王变成JOJO风
2020/03/02 日漫
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
PHP读取txt文件的内容并赋值给数组的代码
2011/11/03 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
JavaScript制作简单的框选图表
2017/05/15 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
2019/11/06 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
python logging类库使用例子
2014/11/22 Python
进一步探究Python中的正则表达式
2015/04/28 Python
python difflib模块示例讲解
2017/09/13 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
python内置函数:lambda、map、filter简单介绍
2017/11/16 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
室内设计自我鉴定
2013/10/15 职场文书
国际商务专业求职信
2014/07/15 职场文书
教师辞职书范文
2015/02/26 职场文书
浅谈Python3中datetime不同时区转换介绍与踩坑
2021/08/02 Python