[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 相关文章推荐
IE、FF、Chrome浏览器中的JS差异介绍
Aug 13 Javascript
jquery获取一组checkbox的值(实例代码)
Nov 04 Javascript
简体中文转换繁体中文(实现代码)
Dec 25 Javascript
JavaScript编写连连看小游戏
Jul 07 Javascript
基于JavaScript如何制作遮罩层对话框
Jan 26 Javascript
值得分享和收藏的Bootstrap学习教程
May 12 Javascript
jQuery中可见性过滤器简单用法示例
Mar 31 jQuery
JavaScript执行环境及作用域链实例分析
Aug 01 Javascript
vue安装遇到的5个报错及解决方法
Jun 12 Javascript
简述vue-cli中chainWebpack的使用方法
Jul 30 Javascript
jQuery实现本地存储
Dec 22 jQuery
JS前端使用canvas实现物体的点选示例
Aug 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
php中限制ip段访问、禁止ip提交表单的代码分享
2014/08/22 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
2010/01/22 Javascript
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
React Native之TextInput组件解析示例
2017/08/22 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
vue实现简单的日历效果
2020/09/24 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
python实现静态服务器
2019/09/05 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
我未来的职业规划范文
2014/01/11 职场文书
士力架广告词
2014/03/20 职场文书
学校党的群众路线教育实践活动总结报告
2014/07/03 职场文书
出国签证在职证明
2014/09/20 职场文书
2014年班组工作总结
2014/11/20 职场文书
2014年初级职称工作总结
2014/12/08 职场文书
幼儿教师辞职信
2015/02/27 职场文书
MySQL 数据类型详情
2021/11/11 MySQL
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang