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 写类方式之五
Jul 05 Javascript
JavaScript入门之事件、cookie、定时等
Oct 21 Javascript
js中的replace方法使用介绍
Oct 28 Javascript
vue引入swiper插件的使用实例
Jul 19 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
Aug 08 jQuery
vue2+el-menu实现路由跳转及当前项的设置方法实例
Nov 07 Javascript
详解如何在angular2中获取节点
Nov 23 Javascript
ES6 Iterator接口和for...of循环用法分析
Jul 31 Javascript
layui上传图片到服务器的非项目目录下的方法
Sep 26 Javascript
js实现超级玛丽小游戏
Mar 18 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
Apr 08 Javascript
Vue 3.0 全家桶抢先体验
Apr 28 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 session机制
2011/07/17 PHP
ThinkPHP中的关联模型注意点
2014/06/16 PHP
smarty模板引擎中变量及变量修饰器用法实例
2015/01/22 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
javascript dom追加内容实现示例
2013/09/21 Javascript
js将json格式内容转换成对象的方法
2013/11/01 Javascript
document.write的几点使用心得
2014/05/14 Javascript
Bootstrap每天必学之表单
2015/11/23 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
理解javascript中try...catch...finally
2015/12/25 Javascript
JavaScript判断微信浏览器实例代码
2016/06/13 Javascript
jquery延迟对象解析
2016/10/26 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
Angularjs分页查询的实现
2017/02/24 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
Pandas读写CSV文件的方法示例
2019/03/27 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
Win10下python 2.7与python 3.7双环境安装教程图解
2019/10/12 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
2020/12/17 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
医德医魂心得体会
2014/09/11 职场文书
校车安全管理责任书
2015/05/11 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis