当前位置:首页 > 日记 > 正文

[js高手之路]图解javascript的原型 | prototype对象,原型链实例

[js高手之路]图解javascript的原型 | prototype对象,原型链实例

我们通过原型方式,解决了多个实例的方法共享问题,接下来,我们就来搞清楚原型(prototype),原型链的来龙去脉。

function CreateObj(uName) {   this.userName = uName;  }  CreateObj.prototype.showUserName = function(){   return this.userName;  }  var obj1 = new CreateObj('ghostwu');  var obj2 = new CreateObj('卫庄');

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() ); //ghostwuconsole.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

CreateObj.prototype.__proto__指向的是Object.prototype, 通过 全等运算符 (===) 测试之后为true

Object.prototype.__proto__ 指向的是NULL

这就是原型链,通过隐式原型把一些构造函数层层的串起来,通过上面这个图,就知道,为什么自定义的对象能调用toString, valueOf,等方法了吧?

因为所有的对象都是继承自Object.

以上这篇[js高手之路]图解javascript的原型(prototype)对象,原型链实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

相关文章

Vue-resource拦截器判断token失效

Vue-resource拦截器判断token失效

失效,拦截器,跳转,实例,电脑软件,在拦截器中设置全局的token判断,意味着每次http请求都会校验token,与后台约定好的token过期返回码可以自定义跳转路径;var token = window.localStorage.getItem("token");Vue.http.interceptors.push(funct…

微信小程序 选项卡的简单实例

微信小程序 选项卡的简单实例

简单实例,选项卡,程序,电脑软件,微信小,微信小程序 选项卡的简单实例看下效果 代码:home.wxml<!--pages/home/home.wxml--><view class="swiper-tab"> <view class="swiper-tab-item {{currentTab==0 ? 'on' : ''}}" data-current…

PHP网站自动化配置的实现方法 | 必

PHP网站自动化配置的实现方法 | 必

方法,网站,配置,必看,电脑软件,一直都在用yii2做项目,有在用自动化配置,但是没有自己去配置过。中午没事去看了下yii的初始化代码,发现都是php而已!yii2初始化项目代码所以,我们做项目肯定是可以用php做的,于是我新建了个文件夹,名为autoConfig,里…

ASP.NET调用WebService服务的方法

ASP.NET调用WebService服务的方法

方法,服务,调用,详解,电脑软件,本文实例讲述了ASP.NET调用WebService服务的方法。分享给大家供大家参考,具体如下:一、WebService:WebService是以独立于平台的方式,通过标准的Web协议,可以由程序访问的应用程序逻辑单元。(1)应用程序逻辑单元:web服…

AI怎么做卡通字 AI制作可爱立体卡

AI怎么做卡通字 AI制作可爱立体卡

教程,卡通,怎么做,可爱,电脑软件,效果图:主要过程:12 3 4 5 阅读全文1 23 4 5 阅读全文1 2 34 5 阅读全文1 2 3 45 阅读全文教程结束,以上就是AI怎么做卡通字 AI制作可爱立体卡通字教程的全部内容,希望大家喜欢!相关教程推荐:AI打造漂亮可爱…

PS合成星空下的女孩靠在大猫怀里阅

PS合成星空下的女孩靠在大猫怀里阅

靠在,怀里,场景,星空,女孩,效果图非常奇幻,用到的素材不多,不过在合成的时候要注意好光影的处理,尤其是加入路灯后,要根据光源位置处理好素材的受光。最终效果1、新建1800px * 1228px,分辨率为150px文件。 2、把素材拖到文档,调整合适的位置,创建…

ppt2007中文版怎么设置无边界打印

ppt2007中文版怎么设置无边界打印

边界,设置,中文版,技巧,电脑软件,  在打印之前,如果没有选择合适的文档打印边界,会导致打印出的文档非常难看,那么要怎么设置无边界打印呢?下面小编马上就告诉大家 ppt2007设置无边界打印的方法,希望看完本教程的朋友都能学会并运用起来。pp…

ps怎么设计一款热气球矢量图素材?

ps怎么设计一款热气球矢量图素材?

矢量图,热气球,素材,电脑软件,ps,想要自己谁及一款热气球矢量图,该怎么设计呢?下面我们就来看看使用ps设计的方法。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-041、气球的形状就是由圆形变化而来的,我们…

word2013中插入特殊符号的两种技巧

word2013中插入特殊符号的两种技巧

特殊符号,两种,技巧,电脑软件,  有时候,我们编辑了一篇文章后,希望能够添加一些特殊符号,使得文章变得更加的丰富多彩,那么特殊符号怎么插入到文章中呢?接下来就由小编给大家分享下word2013中插入特殊符号的技巧,希望能帮助到您。插入特殊符号…

excel公式提取中括号内容的方法exc

excel公式提取中括号内容的方法exc

方法,括号,公式,内容,电脑软件,  在Excel中录入好数据以后经常需要用到函数进行计算,其中会需要用公式进行提取中括号里的内容,具体该怎么操作?,接下来是小编为大家带来的excel 公式提取中括号内容的方法,供大家参考。excel 公式提取括号内容…

Vue.directive自定义指令的使用详

Vue.directive自定义指令的使用详

自定义指令,详解,电脑软件,Vue,directive,很多教程都是在讲自定义指令的概念和语法,看的相当蛋疼.本文不讲语法和概念,只讲用法.自定义指令基本就是用来操作DOM的,虽然官方推荐数据驱动视图,有时候还是需要自定义指令来操作DOM,指令可复用.…

ps怎么给制作漂亮的拼贴叠加效果?

ps怎么给制作漂亮的拼贴叠加效果?

叠加,效果,漂亮,电脑软件,ps,Photoshop是我们日常工作学习中,经常用到的一款图像处理软件。今天给大家分享用一张图片做多出张拼接效果,主要用到矩形工具、把图片嵌入图形中,然后复制出多个图形,分散叠放好,加上投影的效果更漂亮。软件名称:Adobe…