JavaScript的面向对象编程(OOP)(三)——聚合
之前写过了类和原型,这里再说聚合,在写关于聚合之前,对与继承我再总结一下。JavaScript中关于继承的方式一共有三种,之前写了两种,但是没有说明,这里补充说明一下。
1.类式继承:通过在函数对象内调用父类的构造函数,使自身获得父类的属性和方法。主要使用call和apply回调
var Person = function(){
this.age = 16;
this.sayName = function(){
alert(this.name+this.age);
}
}
var student = function(){
this.name = 'bote';
Person.call(this);
}
var bote = new student();
bote.sayName();
2.原型继承:通过Prototype属性继承,这个在上一篇文章中有详细的描述,这里就不再叙述
3.聚合:有时候,我们并不需要严格的继承,真正需要的是一个类(或几个类)中的某些函数方法,这时候我们就要用到聚合了。
介绍聚合之前需要先说一下掺元类(Mixin Classes),这是一种不需要用到严格的继承就可以复用代码的一种技术。这个类是用作扩展类的模版使用。
//准备将要聚合的函数
var JSON = { };
JSON.prototype = {
toJSONString: function(){
var outPut = [];
for(key in this){
outPut.push(key+"-->"+this[key]);
}
return outPut;
}
}
//制作聚合函数,即一个掺元类,传入两个参数,子类和父类
function mixin(receivingclass,givingclass){
//遍历父类的原型中所有的原型函数
for(methodName in givingclass.prototype){
//如果子类的原型中不存在这个原型函数,就从父类那里继承过来
if(!receivingclass.prototype[methodName]){
receivingclass.prototype[methodName] = givingclass.prototype[methodName];
}
}
}
//测试
var o = function(){
this.name = "yuan";
this.age = 24;
}
o.prototype = {
toTest:function(){
alert(2);
}
};
mixin(o,JSON);
var a = new o();
alert(a.toJSONString());
//弹出name-->yuan,age-->24,toTest-->function (){ alert(2); },toJSONString-->function (){ var outPut = []; for(key in this){ outPut.push(key+"-->"+this[key]); } return outPut; }
可以看出,我们通过mixin函数来选择性继承了JSON的toJSONString方法,而与父类方法明一样的toTest方法还是本身的原型方法。
这是使用函数定义的类,是这样使用的,如果使用直接量定义的类,我们只需要将聚合函数里的prototype改为__proto__即可,完全的聚合方法如下
function mixin(receivingclass,givingclass){
for(methodName in givingclass){
f(!receivingclass.__proto__[methodName]){
receivingclass.__proto__[methodName] = givingclass[methodName];
}
}
}
这样是对于只用直接量定义的类使用,如下
var o = {naem:"sda",age:22};
mixi(o,JSON);
alert(o.toJSONString());
这样便将JSON原型里的toJSONString方法直接继承了。
JavaScript的面向对象编程(OOP)(三)——聚合的更多相关文章
- JavaScript的面向对象编程(OOP)(一)——类
在学习JavaScript面向对象的编程之前,需要知道,并了解面向对象的一些基本的常识.初学者中大多数都以为面向对象中,面向对象的编程是很重要和占据很大一部分精力.笔者在之前也是认为OOP是面向对象的 ...
- Javascript面向对象编程(三):非构造函数的继承(对象的深拷贝与浅拷贝)
Javascript面向对象编程(三):非构造函数的继承 作者: 阮一峰 日期: 2010年5月24日 这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现&quo ...
- JavaScript 面向对象编程(三):非构造函数对象的继承
JavaScript 面向对象编程(三):非构造函数对象的继承 一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". var Chinese ...
- 【软件构造】第三章第四节 面向对象编程OOP
第三章第四节 面向对象编程OOP 本节讲学习ADT的具体实现技术:OOP Outline OOP的基本概念 对象 类 接口 抽象类 OOP的不同特征 封装 继承与重写(override) 多态与重载( ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)
一.面向对象编程(继承) 这篇博客是面向对象编程的第三篇,JS继承.继承顾名思义,就是获取父辈的各种"财产"(属性和方法). 怎么实现继承? 我们的JavaScript比较特别了, ...
- 学习面向对象编程OOP 第一天
面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...
- JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则
注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html < ...
- js面向对象编程(三)非构造函数的继承(转载)
Javascript面向对象编程(三):非构造函数的继承 今天是最后一个部分,介绍不使用构造函数实现"继承". 一.什么是"非构造函数"的继承? 比如,现在有一 ...
随机推荐
- 判断checkbox是否选中
一种是通过jquery A. $("[name='selectUserId']:checked").each(function () { // $(this).attr(" ...
- SeleniumIDE从0到1 (Selenium IDE 录制)
seleniumIDE安装成功后下面我们用百度网址来简单录制下: 简介一:百度输入框录制操作 1.打开SeleniumIDE 2.SeleniumIDE地址栏中输入百度网址:[https://www. ...
- html(一)
一丶网页的主体结构 <html><head> <title>标题</title> //浏览器的标题</head><body> ...
- Ubuntu上Docker安装Trouble Shooting
(我的环境是Mint7.1,相当于Ubuntu14.04) 1,首先,根据docker.com上的安装指导来安装docker,这里就不重复了,参考: https://docs.docker.com/i ...
- java full gc
转自:http://blog.sina.com.cn/s/blog_7a351012010163a1.html
- [CF752D]Santa Claus and a Palindrome(优先队列,贪心乱搞)
题目链接:http://codeforces.com/contest/752/problem/D 题意:给长度为k的n个字符串,每一个字符串有权值,求构造一个大回文串.使得权值最大. 因为字符串长度都 ...
- oracle过滤字母
select regexp_replace(col,'[A-Za-z]') from dual; --> 12345col 列名
- 巧用CSS3伪类选择器自定义checkbox和radio的样式
由于原生的checkbox和radio的样式太简陋了,在设计页面的时候,设计师往往会设计自己的checkbox和radio样式.一半情况下,为了适应各个浏览器的兼容性,我们都会用其他的元素替代原生的c ...
- RealSense开发-Session和SenseManager的几种创建方法
从Intel RealSense 的SDK文档对其架构(如图1所示)的始描述可知,Session是SDK应用的主控模块,必须在所有模块操作之前创建,并且在所有模块注销后最后注销.SenseManage ...
- 【转】Unix NetWork Programming——环境搭建(解决unp.h等源码编译问题)
下面开始用简单但典型的客户端和服务器端程序说明如何进行网络编程.这一小节讲的是客户端,一个用来连接并读取服务器发送来的时间的客户端. 这里涉及到了编写代码,因此要 搭建unix网络编程环境 unix系 ...