JavaScript 原型与继承说明


Posted in Javascript onJune 09, 2010
function A(x) 
{ 
this.x = x; 
} 
alert(A.prototype); 
alert(A.prototype.constructor);

根据弹出的结果,我们可以得到:原型对象是由函数的构造函数创建,它所拥有的属性能被所有对象共享,初始时原型对象指向一个Object对象,并且定义了一个constructor属性,该属性指向定义该原型对象的构造函数本身,再看如下代码。

Code

function A(x) 
{ 
A.prototype.x = x; 
} 
var obj = new A(10); 
alert(obj.x); 
alert(obj.constructor);

因为原型对象的所有属性能被构造函数创建对象共享,所以创建的对象可以访问这里的constructor属性,同时obj对应的就是原型对象(prototype)所创建出来的一个实例,那么重写constructor属性会出现什么样的结果呢?

Code

function A(x) 
{ 
A.prototype.x = x; 
} 

var objA = new A(10); 
objA.constructor = function(x){ alert("重写obj的constructor属性");this.x = 20 }; 
objA.constructor(); 
alert(objA.x); 

var objB = new A(10); 
alert(objB.x);

根据结果我们可以看到,首先弹出的是“重写obj的constructor属性”,然后弹出20,在弹出10,可见,我们在书写重写objA这个对象的constructor之后,objB并没有被改变,因此无论在一个对象加入或修改多少属性这都不影响其原型对象中属性的本来面目,其实很容易理解js为什么这样做,因为一个对象的行为不能影响到其他对象,否则将会造成混乱。

在这里,我们可以总结一下,上面代码的规则:

1.当我们调用某个对象的时候,首先检查该对象本身的自己定义的属性,如果存在则调用。

2.当自己本身的属性不存在的时候,则调用其构造函数所定义的原型对象的引用。

那么根据这个规则,就形成了JavaScript中的一个原型链,我们就可以根据这个规则来定义继承关系。

function A(x) 
{ 
A.prototype.x = x; 
} 

function B(x,y) 
{ 
B.prototype.y = y; 
A.call(this,x); 
}

这段代码显示了两个函数,B函数继承与A函数,A.call(this.x)表示,将B的对象this传递到A函数中进行执行。然后,我们同样需要由B函数构造出来的对象需要包含A函数的所有特性,因此需要加上这么一句话。

B.prototype = new A(); 

alert(B.prototype.constructor);

先我们指定B的原型为A,因此,B函数继承了A函数的特性,根据弹出的结果,我们可以看到,其constructor指向的是A函数,那么我们的B函数的特性是不是丢失了呢?因此,我们需要在加上一句话,最后给出继续的整合代码。
function A(x) 
{ 
A.prototype.x = x; 
A.prototype.ShowA = function(){ alert("A的Show方法!"); }; 
} 

function B(x,y) 
{ 
B.prototype.y = y; 
A.call(this,x); 
B.prototype.ShowB = function(){ alert("B的Show方法!"); }; 
} 

B.prototype = new A(); 
B.prototype.constructor = B; 

var obj = new B(10,5); 
alert(obj.x); 
alert(obj.y); 
obj.ShowA(); 
obj.ShowB();

若有疑问或不正之处,欢迎提出指正和讨论。

Javascript 相关文章推荐
js 浮动层菜单收藏
Jan 16 Javascript
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
Sep 15 Javascript
调用HttpHanlder的几种返回方式小结
Dec 20 Javascript
javaScript对文字按照拼音排序实现代码
Dec 27 Javascript
javascript实现浏览器窗口传递参数的方法
Sep 03 Javascript
chrome不支持form.submit的解决方案
Apr 28 Javascript
AngularJS学习笔记之基本指令(init、repeat)
Jun 16 Javascript
JS多文件上传的实例代码
Jan 11 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
Jan 17 Javascript
javascript设计模式之模块模式学习笔记
Feb 15 Javascript
ionic实现底部分享功能
May 11 Javascript
vue $set 给数据赋值的实例
Nov 09 Javascript
JavaScript 构造函数 面相对象学习必备知识
Jun 09 #Javascript
JS 图片缩放效果代码
Jun 09 #Javascript
JQuery优缺点分析说明
Jun 09 #Javascript
web页面数据展示新想法(json)
Jun 08 #Javascript
js客户端快捷键管理类的较完整实现和应用
Jun 08 #Javascript
location.search在客户端获取Url参数的方法
Jun 08 #Javascript
js word表格动态添加代码
Jun 07 #Javascript
You might like
php5中date()得出的时间为什么不是当前时间的解决方法
2008/06/30 PHP
PHP中ini_set和ini_get函数的用法小结
2014/02/18 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
详解jQuery的Cookie插件
2016/11/23 Javascript
angularjs实现下拉列表的选中事件示例
2017/03/03 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
2018/03/06 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
Python出现segfault错误解决方法
2016/04/16 Python
Python科学画图代码分享
2017/11/29 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
Python实现求解括号匹配问题的方法
2018/04/17 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
python 实现目录复制的三种小结
2019/12/04 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
python编程的核心知识点总结
2021/02/08 Python
英国领先的露营和露营车品牌之一:OLPRO
2019/08/06 全球购物
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
《夹竹桃》教学反思
2014/04/20 职场文书
党员先锋岗事迹材料
2014/05/08 职场文书
新学期开学标语
2014/06/30 职场文书
信仰纪录片观后感
2015/06/08 职场文书
JavaScript实现登录窗体
2021/06/22 Javascript
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android
Python  lambda匿名函数和三元运算符
2022/04/19 Python