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 相关文章推荐
JS之小练习代码
Oct 12 Javascript
Confirmer JQuery确认对话框组件
Jun 09 Javascript
js时间日期格式化封装函数
Dec 02 Javascript
浅谈Javascript变量作用域问题
Dec 16 Javascript
JavaScript中的函数声明和函数表达式区别浅析
Mar 27 Javascript
浅析JavaScript声明变量
Dec 21 Javascript
jquery实现倒计时功能
Dec 28 Javascript
vue将毫秒数转化为正常日期格式的实例
Sep 16 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
Sep 26 Javascript
使用Node.js实现base64和png文件相互转换的方法
Mar 11 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
Jul 22 Javascript
深入详解JS函数的柯里化
Jun 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
php性能优化分析工具XDebug 大型网站调试工具
2011/05/22 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
基于JQuery框架的AJAX实例代码
2009/11/03 Javascript
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
代码获取历史上的今天发生的事
2014/04/11 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
2017/04/19 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
vue中英文切换实例代码
2020/01/21 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
python的常见命令注入威胁
2013/02/18 Python
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
python获取url的返回信息方法
2018/12/17 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
python中threading开启关闭线程操作
2020/05/02 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
银行存款证明样本
2014/01/17 职场文书
企业党员一句话承诺
2014/05/30 职场文书
初三英语教学计划
2015/01/23 职场文书
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL
Tomcat配置访问日志和线程数
2022/05/06 Servers