我们通过原型方式,解决了多个实例的方法共享问题,接下来,我们就来搞清楚原型(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() ); //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
CreateObj.prototype.__proto__指向的是Object.prototype, 通过 全等运算符 (===) 测试之后为true
Object.prototype.__proto__ 指向的是NULL
这就是原型链,通过隐式原型把一些构造函数层层的串起来,通过上面这个图,就知道,为什么自定义的对象能调用toString, valueOf,等方法了吧?
因为所有的对象都是继承自Object.
以上这篇[js高手之路]图解javascript的原型(prototype)对象,原型链实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# js原型对象
# prototype
# 图解JS原型和原型链实现原理
# [js高手之路]从原型链开始图解继承到组合继承的产生详解
# 五句话帮你轻松搞定js原型链
# JavaScript原型链与继承操作实例总结
# javascript原型链图解的总结和实践
# 就会
# 图中
# 的是
# 写在
# 都有
# 多个
# 这两个
# 给大家
# 不存在
# 隐式
# 都是
# 是一个
# 我还
# 我有
# 这就是
# 找不到
# 说过
# 之路
# 希望能
# 来龙去脉
相关文章:
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
如何用好域名打造高点击率的自主建站?
建站之星下载版如何获取与安装?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
高防服务器租用如何选择配置与防御等级?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
建站之家VIP精选网站模板与SEO优化教程整合指南
如何在Golang中使用replace替换模块_指定本地或远程路径
山东网站制作公司有哪些,山东大源集团官网?
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何快速搭建高效服务器建站系统?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
如何在Windows 2008云服务器安全搭建网站?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
如何选择PHP开源工具快速搭建网站?
如何通过FTP服务器快速搭建网站?
建站之星在线版空间:自助建站+智能模板一键生成方案
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
建站之星logo尺寸如何设置最合适?
建站之星代理如何获取技术支持?
建站主机与虚拟主机有何区别?如何选择最优方案?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
python的本地网站制作,如何创建本地站点?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
深圳网站制作的公司有哪些,dido官方网站?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
,柠檬视频怎样兑换vip?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
,制作一个手机app网站要多少钱?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
建站主机系统SEO优化与智能配置核心关键词操作指南
手机网站制作与建设方案,手机网站如何建设?
建站之星伪静态规则如何设置?
建站DNS解析失败?如何正确配置域名服务器?
招贴海报怎么做,什么是海报招贴?
企业微网站怎么做,公司网站和公众号有什么区别?
如何通过多用户协作模板快速搭建高效企业网站?
如何快速辨别茅台真假?关键步骤解析
建站ABC备案流程中有哪些关键注意事项?
如何通过远程VPS快速搭建个人网站?
家具网站制作软件,家具厂怎么跑业务?
建站之星图片链接生成指南:自助建站与智能设计教程
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
建站之星安装需要哪些步骤及注意事项?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
教学网站制作软件,学习*后期制作的网站有哪些?
网站制作说明怎么写,简述网页设计的流程并说明原因?
如何选择最佳自助建站系统?快速指南解析优劣
安徽网站建设与外贸建站服务专业定制方案
如何快速配置高效服务器建站软件?
*请认真填写需求信息,我们会在24小时内与您取得联系。