之前写过了类和原型,这里再说聚合,在写关于聚合之前,对与继承我再总结一下。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)(三)——聚合的更多相关文章

  1. JavaScript的面向对象编程(OOP)(一)——类

    在学习JavaScript面向对象的编程之前,需要知道,并了解面向对象的一些基本的常识.初学者中大多数都以为面向对象中,面向对象的编程是很重要和占据很大一部分精力.笔者在之前也是认为OOP是面向对象的 ...

  2. Javascript面向对象编程(三):非构造函数的继承(对象的深拷贝与浅拷贝)

    Javascript面向对象编程(三):非构造函数的继承   作者: 阮一峰 日期: 2010年5月24日 这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现&quo ...

  3. JavaScript 面向对象编程(三):非构造函数对象的继承

    JavaScript 面向对象编程(三):非构造函数对象的继承 一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". var Chinese ...

  4. 【软件构造】第三章第四节 面向对象编程OOP

    第三章第四节 面向对象编程OOP 本节讲学习ADT的具体实现技术:OOP Outline OOP的基本概念 对象 类 接口 抽象类 OOP的不同特征 封装 继承与重写(override) 多态与重载( ...

  5. JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)

    一.面向对象编程(继承) 这篇博客是面向对象编程的第三篇,JS继承.继承顾名思义,就是获取父辈的各种"财产"(属性和方法). 怎么实现继承? 我们的JavaScript比较特别了, ...

  6. 学习面向对象编程OOP 第一天

    面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...

  7. JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  8. JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  9. S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则

    注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html      < ...

  10. js面向对象编程(三)非构造函数的继承(转载)

    Javascript面向对象编程(三):非构造函数的继承 今天是最后一个部分,介绍不使用构造函数实现"继承". 一.什么是"非构造函数"的继承? 比如,现在有一 ...

随机推荐

  1. vue 命名视图

    命名视图 有时候想同时(同级)展示多个视图,而不是嵌套展示,例如创建一个布局,有 sidebar(侧导航) 和 main(主内容) 两个视图,这个时候命名视图就派上用场了.你可以在界面中拥有多个单独命 ...

  2. ThreadLocal的理解

    ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的.每个线程 ...

  3. NOIP2014 day2 T2寻找道路

    #include<iostream> #include<cmath> #include<cstdlib> #include<cstdio> #inclu ...

  4. 浮动div中的图片垂直居中

    table-cell方法垂直水平居中 <!DOCTYPE html> <html> <head> <meta name="description&q ...

  5. System Setup

    vistual studio 2013 download: http://www.microsoft.com/en-us/download/details.aspx?id=48138 http://w ...

  6. TensorFlow白皮书

    TensorFlow [1] is an interface for expressing machine learning algorithms, and an implementation for ...

  7. Android Listview

    方法一: xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...

  8. Android开发——搭建最新版本的Android开发环境

    http://www.cnblogs.com/smyhvae/p/3788534.html http://www.cnblogs.com/xdp-gacl/p/4322165.html http:// ...

  9. json接口

    http://api.rottentomatoes.com/api/public/v1.0/lists/movies/in_theaters.json?apikey=7waqfqbprs7pajbz2 ...

  10. Adding a Controller

    MVC stands for Model, View, Controller. MVC is a pattern for developing applications such that each ...