prototype与[[prototype]]
在有面象对象基础的前提下,来看一段代码:
复制代码 代码如下:
//Animal构造函数
function Animal(name){
this.name = name;
}
//Animal原型对象
Animal.prototype = {
id:"Animal",
sleep:function(){
alert("sleep");
}
}
var dog = new Animal("旺才");
alert(dog.name);//旺才
alert(dog.id);//Animal
dog.sleep()//sleep
其对应的简易内存分配结构图:
现在让我们来解释一下这张内存图的来龙去脉:
首先明确一点[[prototype]]与prototype并不是同一个东西。
那先来看prototype,每一个函数对象都有一个显示的prototype属性,它代表了对象的原型,更明确的说是代表了由函数对象(构造函数)所创建出来的对象的原型。结合本例,Animal.prototype就是dog的原型,dog所引用的那个对象将从Animal.prototype所引用的对象那继承属性与方法。
每个对象都有一个名为[[Prototype]]的内部属性,指向于它所对应的原型对象。在本例中dog的[[prototype]]指向Animal.prototype,大家都知道,Animal.prototype也是一个对象,即然是一个对象,那它必然也有[[prototype]]属性指向于它所对应的原型对象,由此便构成了一种链表的结构,这就是原型链的概念。额外要说的是:不同的JS引擎实现者可以将内部[[Prototype]]属性命名为任何名字,并且设置它的可见性,前且只在JS引擎内部使用。虽然无法在JS代码中访问到内部[[Prototype]](FireFox中可以,名字为__proto__因为Mozilla将它公开了),但可以使用对象的 isPrototypeOf()方法进行测试,注意这个方法会在整个Prototype链上进行判断。
注:关于函数对象的具体内容,将在后继的博文中讲解。
属性访问原则 使用obj.propName访问一个对象的属性时,按照下面的步骤进行处理(假设obj的内部[[Prototype]]属性名为__proto__):
1. 如果obj存在propName属性,返回属性的值,否则
2. 如果obj.__proto__为null,返回undefined,否则
3. 返回obj.__proto__.propName
调用对象的方法跟访问属性搜索过程一样,因为方法的函数对象就是对象的一个属性值。
提示: 上面步骤中隐含了一个递归过程,步骤3中obj.__proto__是另外一个对象,同样将采用1, 2, 3这样的步骤来搜索propName属性。
这就是基于Prototype的继承和共享。其中object1的方法fn2来自object2,概念上即object2重写了object3的方法fn2。
JavaScript对象应当都通过prototype链关联起来,最顶层是Object,即对象都派生自Object类型。
结合是上面的理论,让我们再来看一个更加复杂的示例,他明确的解释了prototype、[[prototype]]、原型链以及属性访问的相关要点:
复制代码 代码如下:
//Animal构造函数
function Animal(name){
this.name = name;
}
//Animal原型对象
Animal.prototype = {
id:"Animal",
sleep:function(){
alert("sleep");
}
}
function Human(name,age){
Animal.call(this,name);
this.age = age;
}
Human.prototype = new Animal();
Human.prototype.id = "Human";
Human.prototype.say = function(){
alert("hello everyone,My name is "+this.name +",I'm "+this.age+" and I'm a "+this.id);
}
//Human相关调用
var jxl = new Human('笨蛋',25);
alert(jxl.name);//笨蛋
alert(jxl.id);//Human
jxl.say();//hello everyone,My name is 笨蛋,I'm 25 and I'm a Human
alert(Animal.prototype.isPrototypeOf(jxl));//true
alert(Object.prototype.isPrototypeOf(jxl));//true
根据上面的代码,你能画出相应的内存图吗?好,让我们来看一下:
注:prototype的根为Object.prototype,对象Object.prototype的内部[[prototype]]属性为null.
其实,这里还有很多东西可以讲,但在其原理都在这张图上了,可试着调整一下代码的次序,如将Human.prototype.id = "Human";放在Human.prototype = new Animal();的前面,看一下运行结果,解释一下为什么之类的,你可以学到很多。
我发现,通过内存来展现程序内部运行细节真的是太完美了!
相关推荐:
ChatGPT启动时遇到问题?快速解决方案让你畅享智能对话体验,ai如何保存logo
AI工具汇总网站,让科技为您的工作加速
seo该从什么开始,seo是什么时候开始的 ,ai写作免费英文怎么说
SEO优化要钱吗?揭秘SEO投资背后的价值与回报,ai领域
SEO优化是做什么的?让你的网站流量飙升的秘密武器,乳腺癌ai作用机理
如何用AI写公众号文章?让创作更高效、更轻松
ChatGPT免费订阅的使用限制:其潜力与挑战,ai辅助线无法对齐画板
SEO前的准备工作:如何让网站为搜索引擎优化做好充分准备,SEO_网站排名优化_网络推广
SEO与网络推广机构:如何选择最适合你的数字营销合作伙伴,ai写作软件性价比高吗
Chatget免费网站版无需登录,畅享无限对话体验!,工业 Ai 视觉检测
ChatGPT:如果您正在使用VPN,这些技巧您一定要知道!,AI换脸*H
为什么“未备案域名”会成为互联网行业中的重要问题?,江干区seo优化价格
SEO收费如何选择合适的SEO服务,提升网站排名并增加曝光度,做网站优化哪家实惠
ChatGPT不能加载过去的对话,如何提升你的使用体验?,ai智能衣服
如何用AI改文章,让写作更高效、精准,提升内容质量
AI做文章:引领智能创作的未来
seo资源是什么意思,seo资源怎么打开 ,梅州ai自动插件加工
亚马逊seo是什么公司的,“亚马逊” ,ai玩底特律
“新热度”:引领潮流的力量,如何趋势的脉搏,浙江通用网站建设特点
AI网页效果生成:开启网站设计的新纪元,ai画线祥云
ChatGPT无法加载?检查网络并尝试重启,助您快速恢复畅通体验,burj ai
seo网站编辑是做什么,seo网站编辑可在家兼职 ,ai慢直播
ChatGPT页面无法访问?解决方案,让你轻松摆脱困扰!,ai染发颜色
一秒采集:提升效率、创造价值的秘密武器,苏州网站整站优化
ChatGPT常见问题汇总:解答你关于AI的一切疑惑,松鼠ai智能教适应教育
seo网站反链是什么,网站反链怎么做 ,ai插画头像卡通
ChatGPT为什么网址打不开?原因分析与解决方法,文档审核ai
SEO全套秘籍:提升网站流量与排名的终极指南,荣昌手机网站建设
文章写作AI:让创作更高效、精准的智能助手
ZBlog:开启你的个人网站新时代,轻松搭建与管理,二手手机营销推广方案
SEO无限:如何利用SEO技术实现网站流量爆发?,网站建设总监
seo线索收集是什么,seo线索收集是什么意思 ,ai生活ai童童
AI撰写率:让创作变得更高效,助力内容产业腾飞,人力ai
SEO能给企业带来什么价值,seo的影响 ,ai蓝衣美女
用AI写文章:效率与创意的完美结合
怎么降低文章的AI生成率:打造更真实、更有价值的内容
ChatGPT显示“此网站无法加载站点”:背后原因与解决办法详解,用ai画明度渐变条
AI网页生成:轻松构建智能网站,提升品牌竞争力,杭州专业ai智能教育
URL泄露:如何防止信息泄露带来的严重后果,抖音推广营销服务多少钱
ChatGPT破解:人工智能的无限潜力与破解秘笈,意识变ai
seo要公司什么资源,做seo需要用到什么软件 ,ai明星换了
什么是seo反连接,网站反链多好还是少好 ,网易ai产品
SEO好吗?助力网站成功的关键之道,网站优化方案范文怎么写
SEO检测,让网站排名飞升的秘密武器,高端快消食品营销推广
AI智能软件:未来科技的核心力量
为什么网站要做seo,网站做seo的目的是什么 ,ai初选
ChatGPT的梯子:突破网络壁垒,畅享智能对话的全新体验,ai的音标1001ai的音标
seo软件是什么职位,seo用的是什么软件 ,ai感知树
用AI写文章会不会查重率高?破解写作困扰的真相
seo网站自学看什么书,seo技术适合自学吗 ,斑马ai阅读