一. 原型与构造函数
Js所有的函数都有一个prototype属性,这个属性引用了一个对象,即原型对象,也简称原型。这个函数包括构造函数和普通函数,我们讲的更多是构造函数的原型,但是也不能否定普通函数也有原型。譬如普通函数:
复制代码 代码如下:
function F(){
alert(F.prototype instanceof Object) //true;
}
构造函数,也即构造对象。首先了解下通过构造函数实例化对象的过程。
复制代码 代码如下:
function A(x){
this.x=x;
}
var obj=new A(1);
实例化obj对象有三步: 1. 创建obj对象:obj=new Object();
2. 将obj的内部__proto__指向构造他的函数A的prototype,同时,obj.constructor===A.prototype.constructor(这个是永远成立的,即使A.prototype不再指向原来的A原型,也就是说:类的实例对象的constructor属性永远指向"构造函数"的prototype.constructor),从而使得obj.constructor.prototype指向A.prototype(obj.constructor.prototype===A.prototype,当A.prototype改变时则不成立,下文有遇到)。obj.constructor.prototype与的内部_proto_是两码事,实例化对象时用的是_proto_,obj是没有prototype属性的,但是有内部的__proto__,通过__proto__来取得原型链上的原型属性和原型方法,FireFox公开了__proto__,可以在FireFox中alert(obj.__proto__);
3. 将obj作为this去调用构造函数A,从而设置成员(即对象属性和对象方法)并初始化。
当这3步完成,这个obj对象就与构造函数A再无联系,这个时候即使构造函数A再加任何成员,都不再影响已经实例化的obj对象了。此时,obj对象具有了x属性,同时具有了构造函数A的原型对象的所有成员,当然,此时该原型对象是没有成员的。
原型对象初始是空的,也就是没有一个成员(即原型属性和原型方法)。可以通过如下方法验证原型对象具有多少成员。
复制代码 代码如下:
var num=0;
for(o in A.prototype) {
alert(o);//alert出原型属性名字
num++;
}
alert("member: " + num);//alert出原型所有成员个数。
但是,一旦定义了原型属性或原型方法,则所有通过该构造函数实例化出来的所有对象,都继承了这些原型属性和原型方法,这是通过内部的_proto_链来实现的。
譬如
A.prototype.say=function(){alert("Hi")};
那所有的A的对象都具有了say方法,这个原型对象的say方法是唯一的副本给大家共享的,而不是每一个对象都有关于say方法的一个副本。
二. 原型与继承 首先,看个简单的继承实现。
复制代码 代码如下:
function A(x){
this.x=x;
}
function B(x,y){
this.tmpObj=A;
this.tmpObj(x);
delete this.tmpObj;
this.y=y;
}
第5、6、7行:创建临时属性tmpObj引用构造函数A,然后在B内部执行,执行完后删除。当在B内部执行了this.x=x后(这里的this是B的对象),B当然就拥有了x属性,当然B的x属性和A的x属性两者是独立,所以并不能算严格的继承。第5、6、7行有更简单的实现,就是通过call(apply)方法:A.call(this,x);
这两种方法都有将this传递到A的执行里,this指向的是B的对象,这就是为什么不直接A(x)的原因。这种继承方式即是类继承(js没有类,这里只是指构造函数),虽然继承了A构造对象的所有属性方法,但是不能继承A的原型对象的成员。而要实现这个目的,就是在此基础上再添加原型继承。
通过下面的例子,就能很深入地了解原型,以及原型参与实现的完美继承。(本文核心在此^_^)
复制代码 代码如下:
function A(x){
this.x = x;
}
A.prototype.a = "a";
function B(x,y){
this.y = y;
A.call(this,x);
}
B.prototype.b1 = function(){
alert("b1");
}
B.prototype = new A();
B.prototype.b2 = function(){
alert("b2");
}
B.prototype.constructor = B;
var obj = new B(1,3);
这个例子讲的就是B继承A。第7行类继承:A.call(this.x);上面已讲过。实现原型继承的是第12行:B.prototype = new A();
就是说把B的原型指向了A的1个实例对象,这个实例对象具有x属性,为undefined,还具有a属性,值为"a"。所以B原型也具有了这2个属性(或者说,B和A建立了原型链,B是A的下级)。而因为方才的类继承,B的实例对象也具有了x属性,也就是说obj对象有2个同名的x属性,此时原型属性x要让位于实例对象属性x,所以obj.x是1,而非undefined。第13行又定义了原型方法b2,所以B原型也具有了b2。虽然第9~11行设置了原型方法b1,但是你会发现第12行执行后,B原型不再具有b1方法,也就是obj.b1是undefined。因为第12行使得B原型指向改变,原来具有b1的原型对象被抛弃,自然就没有b1了。
第12行执行完后,B原型(B.prototype)指向了A的实例对象,而A的实例对象的构造器是构造函数A,所以B.prototype.constructor就是构造对象A了(换句话说,A构造了B的原型)。
alert(B.prototype.constructor)出来后就是"function A(x){...}" 。同样地,obj.constructor也是A构造对象,alert(obj.constructor)出来后就是"function A(x){...}" ,也就是说B.prototype.constructor===obj.constructor(true),但是B.prototype===obj.constructor.prototype(false),因为前者是B的原型,具有成员:x,a,b2,后者是A的原型,具有成员:a。如何修正这个问题呢,就在第16行,将B原型的构造器重新指向了B构造函数,那么B.prototype===obj.constructor.prototype(true),都具有成员:x,a,b2。
如果没有第16行,那是不是obj = new B(1,3)会去调用A构造函数实例化呢?答案是否定的,你会发现obj.y=3,所以仍然是调用的B构造函数实例化的。虽然obj.constructor===A(true),但是对于new B()的行为来说,执行了上面所说的通过构造函数创建实例对象的3个步骤,第一步,创建空对象;第二步,obj.__proto__ === B.prototype,B.prototype是具有x,a,b2成员的,obj.constructor指向了B.prototype.constructor,即构造函数A;第三步,调用的构造函数B去设置和初始化成员,具有了属性x,y。虽然不加16行不影响obj的属性,但如上一段说,却影响obj.constructor和obj.constructor.prototype。所以在使用了原型继承后,要进行修正的操作。
关于第12、16行,总言之,第12行使得B原型继承了A的原型对象的所有成员,但是也使得B的实例对象的构造器的原型指向了A原型,所以要通过第16行修正这个缺陷。
毕了。
相关推荐:
seo网络推广要做什么,seo 网络推广 ,ai少女喝药
seo需要什么器械,seo需要什么器械才能做 ,长续航ai纯电汽车
seo资源指的是什么,seo资料 ,绿眼AI
seo竞价做的什么工作,seo 竞价 ,office智能ai
AI智能软件:未来科技的核心力量
ChatGPT宕机恢复时间如何解决用户焦虑与技术背后的故事,ai人工智能写作火山
文字写作AI生成工具:让创作更简单、更高效
SEO表述:如何通过精准优化让你的内容脱颖而出,江阴网站建设怎么样啊
SEO中权重是什么意思?让你迅速网站排名的核心秘密!,长颈鹿智能AI点读机
SEO深度解析:如何通过深度优化提升网站排名,带来流量和转化,咸宁网站建设大概费用
亚马逊站内seo是什么优化,亚马逊seo关键词优化软件 ,ai画卡通章鱼
seo配置是什么,seo设置是什么 ,ai图标制作教程
SEO希望:如何通过SEO优化实现网站突破,迈向成功之路,品牌网站推广软件
用AI写科普文章:科技改变写作的未来
ChatGPT内部HTTP接口文档-为开发者提供高效便捷的AI服务接入方式,安屿ai
SEO妍:搜索引擎优化的艺术,轻松打造网络营销新未来,辽宁网站建设贵不贵
AI+写文章:开启智能创作新时代
了解SEO:让你的网站在搜索引擎中脱颖而出的秘密武器,宝山区常见网站优化
SEO网络营销:如何通过精准优化提升品牌价值,青州建设网站电话
软件我在AI:改变未来的智能助手
zblog站群,zblog怎么样 ,欧卡2ai汽车如何使用
SEO策划:让你的网站迅速脱颖而出的秘诀,seo优化和技巧
好用的AI写作软件,让创作更高效
SEO怎么设置:让你的网站快速登上搜索引擎首页的秘密,Ai压印分色
seo规范是什么,seo行业标准 ,啊龙ai音乐
seo营销到底是什么,seo算什么营销 ,ai里面新建
ChatGPT免费订阅的使用限制:其潜力与挑战,ai辅助线无法对齐画板
seo需要做些什么,做seo的 ,超级ai地图
AI网页版本:开启智能时代的新篇章,拼音标调ai
“曝光量扩大,助力品牌腾飞的秘密武器”,盐山网站优化免费咨询
为什么seo对企业重要,seo对企业进行网络营销的价值 ,ai李沁换脸鲍鱼
SEO地址优化的秘诀:提升网站排名与流量的关键,临沂如何优化网站关键词
ChatGPT异常了:人工智能的极限与突破,ai and ethics
SEO优化全攻略提升网站排名的关键步骤与未来趋势,这是什么新晋动画ai
seo系列什么意思,seo的分类 ,que n ai je
Chat启用后ESX连不上?解决方法一网打尽!,为什么AI续写这么离谱
内容创作新时代:自动生成文章的AI如何改变写作生态
SEO技巧提升网站流量和排名,助力企业快速崛起,ai080206.
优化百:开启数字时代的智能营销新时代,湘潭seo优化报价表
为什么选择SEO会员服务,让您的网站流量飞速增长,靖边专业网站建设公司
为什么seo这么难,seo难嘛 ,ai宁中则
怎么降低文章的AI生成率:打造更真实、更有价值的内容
主题导航-引领互联网世界的智慧之路,大渡口网站建设方案
亚马逊中什么是seo,亚马逊sop ,ai临摹中国名画
SEO优化:让你的网站在竞争中脱颖而出,临沧seo代理
ChatGPT免费版每天提问有次数限制吗?揭秘如何高效使用AI助手!,机甲ai手绘
SEO新人必读:从零开始SEO的核心技巧与实践指南,网站邮件推广设计
ChatGPT无法使用?了解原因及解决方法,轻松恢复智能对话体验!,ai满版图案
seo相当于什么职业,seo相当于什么职业类别 ,usatisfy ai
ChatGPT无法完全显示?你可能忽略了这些令人惊讶的细节!,朵朵ai绘画