一个JavaScript继承的实现


Posted in Javascript onOctober 24, 2006

Author:尹伟铭

Blog:http://my.donews.com/yinwm/

如我前面的文章说的,对于JavaScript,一个类,就是一个function,他的类方法(也就是static的)都是作为这个function的一部分,而实例方法,都是在prototype上面的。
function ClassA() {
}

ClassA.staticMethod = function () {
}

ClassA.prototype.instanceMethod = function () {
}

在我这个实现当中,一个类的继承是拷贝父类的所有类方法,这样子类就有了父类的静态方法。
然后让子类的prototype.prototype指向父类的prototype.
然后可以根据自己的需要,重写一些方法。
function ClassB() {
}
ClassB.staticMethod = ClassA.staticMethod;
ClassB.prototype.prototype = ClassA.prototype;
ClassB.prototype.instanceMethod = function () {
// method 2
}

对于子类,使用一个prototype的链,来实现方法的实例方法的继承。之所以选择这种实现方法,是因为子类是要重写其中的某些方法的。而prototype又是一个reference,所以直接的写作ClassB.prototype = ClassA.prototype,会在重写ClassB的实例方法的同时,破坏ClassA的实例方法。而修改后的方法则会屏蔽父类的。

寻找方法的顺序是,instanceA.prototype.method -> ClassA.prototype.
此时对于类方法的继承,已经实现,现在需要实现在子类中,调用父类的方法。
对于Java,这样的使用是很平常的
public void method() {
super.method();
}
在JavsScript中,为了实现此类功能,所以必须保留一个parent的reference,指向ParentClass.prototype.
ClassB.prototype.parent = ClassA.prototype.
那么在instanceB里面调用this.parent.method.call(this);就可以使用父类的方法了。使用call调用,是为了把自己的数据传到父类。更漂亮的解决方法,我还没有想到。

所以完成的代码是
function ClassA() {
}

ClassA.prototype.method1 = function () {
}

ClassA.staticMethod = function () {
}

function ClassB(){
}

ClassB.staticMethod = ClassA.staticMethod;

ClassB.prototype.prototype = ClassB.prototype.parent = ClassA.prototype;

这个我抽象出来一个extend方法,

var LCore = function () {
}

LCore.extend = function (destination, source) {
// copy all functons
for (var prop in source) {
if (prop == “prototype”) {
continue;
}

destination.prototype[prop] = source[prop];
}

// make a reference for parent and reference prototype
destination.prototype.prototype = destination.prototype.parent = source.prototype;

return destination;

Javascript 相关文章推荐
刷新页面实现方式总结(HTML,ASP,JS)
Nov 13 Javascript
jquery 操作日期、星期、元素的追加的实现代码
Feb 07 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
Jan 28 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
Jun 24 Javascript
JavaScript的removeChild()函数用法详解
Dec 27 Javascript
大型JavaScript应用程序架构设计模式
Jun 29 Javascript
d3.js中冷门却实用的内置函数总结
Feb 04 Javascript
js捆绑TypeScript声明文件的方法教程
Apr 13 Javascript
AngularJS 事件发布机制
Aug 28 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
Nov 13 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
Jun 04 jQuery
element-ui 文件上传修改文件名的方法示例
Nov 05 Javascript
动态加载js的几种方法
Oct 23 #Javascript
用js怎么把&字符换成"&amp:"
Oct 19 #Javascript
对联广告js flash激活
Oct 19 #Javascript
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
Oct 17 #Javascript
菜单效果
Oct 14 #Javascript
Using the TextRange Object
Oct 14 #Javascript
使用TextRange获取输入框中光标的位
Oct 14 #Javascript
You might like
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
javaScript数组迭代方法详解
2016/04/14 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
Extjs表单输入框异步校验的插件实现方法
2017/03/20 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
解决Vue watch里调用方法的坑
2020/11/07 Javascript
linux下安装easy_install的方法
2013/02/10 Python
python读取word文档的方法
2015/05/09 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
python画折线图的程序
2018/07/26 Python
python字符串Intern机制详解
2019/07/01 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
django之状态保持-使用redis存储session的例子
2019/07/28 Python
python批量修改ssh密码的实现
2019/08/08 Python
python的scipy实现插值的示例代码
2019/11/12 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
巴西购物网站:Onofre Agora
2020/06/08 全球购物
性能测试工程师的面试题
2015/02/20 面试题
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
应届生高等护理求职信
2013/10/12 职场文书
会计专业个人自我鉴定
2014/03/21 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
人大代表选举标语
2014/10/07 职场文书
区域经理岗位职责
2015/02/02 职场文书
MySQL infobright的安装步骤
2021/04/07 MySQL
Django 如何实现文件上传下载
2021/04/08 Python
Redis 常见使用场景
2021/08/30 Redis
JavaScript正则表达式实现注册信息校验功能
2022/05/30 Java/Android
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python