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 相关文章推荐
JavaScript 的继承
Oct 01 Javascript
jQuery实现流动虚线框的方法
Jan 29 Javascript
JavaScript自定义数组排序方法
Feb 12 Javascript
javascript中字体浮动效果的简单实例演示
Nov 18 Javascript
AngularJS实现标签页的两种方式
Sep 05 Javascript
JSON与XML的区别对比及案例应用
Nov 11 Javascript
Angular.js实现注册系统的实例详解
Dec 18 Javascript
使用JavaScript开发跨平台的桌面应用详解
Jul 27 Javascript
js实现下拉框二级联动
Dec 04 Javascript
vue动态绑定class选中当前列表变色的方法示例
Dec 19 Javascript
Node.js Event Loop各阶段讲解
Mar 08 Javascript
JavaScript实现简单贪吃蛇效果
Mar 09 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
简单采集了yahoo的一些数据
2007/02/14 PHP
PHP在字符断点处截断文字的实现代码
2011/04/21 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
2014/09/04 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
ThinkPHP静态缓存简单配置和使用方法详解
2016/03/23 PHP
PHP格式化MYSQL返回float类型的方法
2016/03/30 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
jquery实现静态搜索功能(可输入搜索文字)
2017/03/28 jQuery
JS排序之冒泡排序详解
2017/04/08 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
利用node.js制作命令行工具方法教程(一)
2017/06/22 Javascript
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
在windows下快速搭建web.py开发框架方法
2016/04/22 Python
Python爬豆瓣电影实例
2018/02/23 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
TensorFlow 显存使用机制详解
2020/02/03 Python
Python运行异常管理解决方案
2020/03/09 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
css3 border-image使用说明
2010/06/23 HTML / CSS
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
TCP/IP的分层模型
2013/10/27 面试题
2014年小班元旦活动方案
2014/02/16 职场文书
授权委托书样本
2014/04/03 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
Python利用capstone实现反汇编
2022/04/06 Python