Javascript学习笔记9 prototype封装继承


Posted in Javascript onJanuary 11, 2010

好,那就让我们一步步打造,首先让我们来看下继承原本的写法:

<script> 
var Person = function(name, age) { 
this.name = name; 
this.age = age; 
} 
Person.prototype.SayHello = function () { 
alert(this.name + "," + this.age); 
}; 
var Programmer = function (name, age, salary) { 
Person.call(this, name, age); 
this.salary = salary; 
}; 
Programmer.prototype = new Person(); 
var pro = new Programmer("kym", 21, 500); 
pro.SayHello(); 
</script>

我们看到,在实际上,继承的根本就在于这一步Programmer.prototype=new Person()。也就是说把Person加到原型链上。这一点在Javascript学习笔记7——原型链的原理 已经有过比较详尽的解释。
那也就是说,我们实现的关键就在于原型链的打造。
在上文中,我们用JSON来打造了一个原型,其原型链是p.__proto__=Person。那么我们希望在这个上封装继承,那么原型链应该是p.__proto__.__proto__=SuperClass,也就是说Person.__proto__=SuperClass。但是按照我们上面代码的继承方法,原型链关系是Person.__proto__=SuperClass.prototype。
这个和我们在上文中一样,我们的办法就是借助一个辅助函数,将原来的函数内的属性赋给X,然后令X.prototype=SuperClass即可,也就是说我们将子原型进行一个封装。
好,就按照这个思路,我们来实现利用原型链的继承关系的封装。
<script> 
var Factory = { 
Create: function (className, params) { 
var temp = function () { 
className.Create.apply(this, params); 
}; 
temp.prototype = className; 
var result = new temp(); 
return result; 
}, 
CreateBaseClass: function (baseClass, subClass) { 
var temp = function () { 
for (var member in subClass) { 
this[member] = subClass[member]; 
} 
}; 
temp.prototype = baseClass; 
return new temp(); 
} 
}; 
var People = { 
Create: function (name, age) { 
this.name = name; 
this.age = age; 
}, 
SayHello: function () { 
alert("Hello,My name is " + this.name + ".I am " + this.age); 
} 
}; 
var Temp = { 
Create: function (name, age, salary) { 
People.Create.call(this, name, age); 
this.salary = salary; 
}, 
Introduce: function () { 
alert(this.name + "$" + this.age + "$" + this.salary); 
} 
}; 
var Programmer = Factory.CreateBaseClass(People, Temp); 
var pro = Factory.Create(Programmer, ["kym", 21, 500]); 
pro.SayHello(); 
</script>

这样就完成了我们对继承关系的封装。当然,我们也可以不单独写一个变量:
var Programmer = Factory.CreateBaseClass(People, 
{ 
Create: function (name, age, salary) { 
People.Create.call(this, name, age); 
this.salary = salary; 
}, 
Introduce: function () { 
alert(this.name + "$" + this.age + "$" + this.salary); 
} 
});

当然,这全凭个人爱好了,个人认为第一种办法相对更清晰一些,但是第二种办法则更优雅。
Javascript 相关文章推荐
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
Feb 15 Javascript
js修改table中Td的值(定义td的双击事件)
Jan 10 Javascript
JavaScript中的数学运算介绍
Dec 29 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
Dec 18 Javascript
JavaScript模块化之使用requireJS按需加载
Apr 12 Javascript
Node.js实现注册邮箱激活功能的方法示例
Mar 23 Javascript
浅谈Angular6的服务和依赖注入
Jun 27 Javascript
使用JS判断移动端手机横竖屏状态
Jul 30 Javascript
详解js静态检查工具eslint配置文件
Nov 23 Javascript
Three.js实现3D机房效果
Dec 30 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
Jan 20 Javascript
基于JavaScript实现随机点名器
Feb 25 Javascript
Javascript学习笔记8 用JSON做原型
Jan 11 #Javascript
Javascript学习笔记7 原型链的原理
Jan 11 #Javascript
Javascript学习笔记6 prototype的提出
Jan 11 #Javascript
Javascript学习笔记5 类和对象
Jan 11 #Javascript
Javascript学习笔记4 Eval函数
Jan 11 #Javascript
Javascript学习笔记2 函数
Jan 11 #Javascript
Javascript学习笔记1 数据类型
Jan 11 #Javascript
You might like
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
2014/10/16 PHP
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
php适配器模式简单应用示例
2019/10/23 PHP
一个加载js文件的小脚本
2007/06/28 Javascript
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
JavaScript实现N皇后问题算法谜题解答
2014/12/29 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
2017/07/04 jQuery
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
JS实现滑动导航效果
2020/01/14 Javascript
利用ctypes提高Python的执行速度
2016/09/09 Python
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
python实现三种随机请求头方式
2021/01/05 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
汽车制造与装配专业自荐信范文
2014/01/02 职场文书
我的求职择业计划书
2014/04/04 职场文书
让世界充满爱演讲稿
2014/05/24 职场文书
个人工作表现评价材料
2014/09/21 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript