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 学习笔记(六)浏览器类型及版本信息检测代码
Apr 08 Javascript
jquery 插件开发 extjs中的extend用法小结
Jan 04 Javascript
javascript模拟命名空间
Apr 17 Javascript
常用javascript表单验证汇总
Jul 20 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
Dec 14 Javascript
Node.js使用cookie保持登录的方法
May 11 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
Aug 29 Javascript
vue+Element实现搜索关键字高亮功能
May 28 Javascript
Node.js学习之内置模块fs用法示例
Jan 22 Javascript
解决vue项目 build之后资源文件找不到的问题
Sep 12 Javascript
vue编写简单的购物车功能
Jan 08 Vue.js
vue判断按钮是否可以点击
Apr 09 Vue.js
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多个文件上传到服务器实例
2014/10/29 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
php限制文件下载速度的代码
2015/10/20 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
angularJS 中$attrs方法使用指南
2015/02/09 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
Vue实现简单的留言板
2020/10/23 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
django 自定义用户user模型的三种方法
2014/11/18 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
Python发送http请求解析返回json的实例
2018/03/26 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
2019/03/01 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
HTML5 canvas基本绘图之绘制线条
2016/06/27 HTML / CSS
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
GWebs公司笔试题
2012/05/04 面试题
护士自我鉴定
2013/10/23 职场文书
大学生实习思想汇报
2014/01/12 职场文书
地理教师岗位职责
2014/03/16 职场文书
学历证明样本
2015/06/16 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
详解Java实现设计模式之责任链模式
2021/06/23 Java/Android
go goroutine 怎样进行错误处理
2021/07/16 Golang