[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 相关文章推荐
如何判断图片地址是否失效
Feb 02 Javascript
基于jquery的图片幻灯展示源码
Jul 15 Javascript
如何将JS的变量值传递给ASP变量
Dec 10 Javascript
JavaScript 实现鼠标拖动元素实例代码
Feb 24 Javascript
jQuery表单域属性过滤器用法分析
Feb 10 Javascript
JQuery替换DOM节点的方法
Jun 11 Javascript
node.js使用cluster实现多进程
Mar 17 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
Aug 27 Javascript
使用vue-router设置每个页面的title方法
Feb 11 Javascript
laydate只显示时分 不显示秒的功能实现方法
Sep 28 Javascript
ES2020 新特性(种草)
Jan 12 Javascript
node.js文件的复制、创建文件夹等相关操作
Feb 05 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正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
深入解析fsockopen与pfsockopen的区别
2013/07/05 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
2020/03/02 PHP
js切换div css注意的细节
2012/12/10 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
jquery实现简单的无缝滚动
2015/04/15 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
在微信小程序中使用mqtt服务的方法
2019/12/13 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
教师自我反思材料
2014/02/14 职场文书
运动会通讯稿500字
2014/02/20 职场文书
副总经理岗位职责
2014/03/16 职场文书
大学生新学期计划书
2014/04/28 职场文书
运动会加油稿20字
2014/11/15 职场文书
中学语文教学反思
2016/02/16 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
Golang 链表的学习和使用
2022/04/19 Golang