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 相关文章推荐
extjs form textfield的隐藏方法
Dec 29 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
Nov 19 Javascript
JavaScript实现x秒后自动跳转到一个页面
Jan 03 Javascript
使用jquery实现div的tab切换实例代码
May 27 Javascript
js 删除数组的几种方法小结
Feb 21 Javascript
浅谈JavaScript函数节流
Dec 09 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
Jan 29 Javascript
jQuery选择器及jquery案例详解(必看)
May 20 Javascript
微信小程序实现带刻度尺滑块功能
Mar 29 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
Jul 13 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
Mar 05 Javascript
js实现简单点赞操作
Mar 17 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
php中目录,文件操作详谈
2007/03/19 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
老生常谈文本文件和二进制文件的区别
2017/02/27 PHP
PDO::setAttribute讲解
2019/01/29 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
2012/08/01 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
js 操作符汇总
2014/11/08 Javascript
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
JavaScript实现数组降维详解
2017/01/05 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
Vue中CSS动画原理的实现
2019/02/13 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
Python中基本的日期时间处理的学习教程
2015/10/16 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
python 实现波浪滤镜特效
2020/12/02 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
经典导游欢迎词大全
2014/01/16 职场文书
生物学学生自我评价
2014/01/17 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
高三霸气励志标语
2014/06/24 职场文书
见习报告怎么写
2014/10/31 职场文书