<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>javascript高级语法4-继承和聚合</title>
</head>
<body>
<script> //继承
//创建人员类
function Person(name){
this.name = name;
}
//创建教师类
function Teacher(name,books){
//call方法可以将一个函数的对象上下文从初始化变成由this来决定。
//调用Person的构造函数,因为person没有new,所以是空对象。
Person.call(this,name);
this.books = books;
}
// 使教师类继承人员类
Teacher.prototype = new Person();
Teacher.prototype.constructor = Teacher;
Teacher.prototype.getBook = function(){
return this.name +" "+this.books;
} //测试
var jim = new Teacher("JIm","extjs4");
//alert(jim.getBook()); // 创建extend函数为了程序中所有的继承操作
function extend(subClass,superClass){
//1.让子类的原型类属性等于父类的原型属性。
// 初始化一个中间空对象,为了转换子父类关系。
var F = function(){};
F.prototype = superClass.prototype;
//2.让子类继承F
subClass.prototype = new F();
subClass.prototype.constructor = subClass;
//3.为子类增加superClass属性
subClass.superClass = superClass.prototype;
//4.增加一个保险,就算原型类是超级类(Object)那么也要把你的构造函数级别降下来。
if(superClass.prototype.constructor = Object.prototype.constructor){
superClass.prototype.constructor = superClass;
}
}
//测试
function Author(name,books){
Author.superClass.constructor.call(this,name);//低耦合
//person.call(this,name) // 高耦合
this.books = books;
this.getBook = function(){
return this.name +" "+this.books;
}
}
//继承
extend(Author,Person); var peter = new Author("张丹","javascript");
alert(peter.getBook()); //聚合
//第一种:原型上方法的聚合
//掺元类: 有时候不需要严格的继承,真正需要的是一个类(几个类)中的一些函数。
var JSON = {};
JSON.prototype = {
changeString:function(){
var output = [];
for(key in this){
output.push(key+"-->"+this[key]);
}
return output;
} }
//制作聚合函数
function mixin(receivingClass,givingClass){
for(method in givingClass.prototype){
// 本类中没有这个函数情况下再聚合,否则跳过
if(!receivingClass.prototype[method]){
receivingClass.prototype[method] = givingClass.prototype[method];
}
}
};
//var o = {name:"zhangdan",age:27};
var o = function(){
this.name = "zhangsan";
this.age = 27;
}
mixin(o,JSON);
var a = new o();
document.write(a.changeString().join(",")) //第二种:类中的函数聚合
var JSON2 = {
toChange:function(){
var output = [];
for(key in this){
output.push(key+"--》"+this[key]);
}
return output;
}
}
//聚合函数
function mixin2(receivingClass,givingClass){
for(method in givingClass){
if(!receivingClass.__proto__[method]){
receivingClass.__proto__[method] = givingClass[method];
}
}
}
var s = {name:"zhangdan",age:30};
mixin2(s,JSON2);
document.write(s.toChange().join(","))
</script>
</body>
</html>

JavaScript设计模式-4.继承和聚合的更多相关文章

  1. 《javascript设计模式》笔记之第四章:继承

    一:首先,一个简单的继承实例: 首先是创建一个父类Person: function Person(name) { this.name = name; } Person.prototype.getNam ...

  2. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  3. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  4. 常用的Javascript设计模式

    <parctical common lisp>的作者曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型 ...

  5. 《Javascript设计模式与开发实践》--读书笔记

    第2章 this call apply bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用. bind( ...

  6. JavaScript设计模式经典-面向对象中六大原则

    作者 | Jeskson来源 | 达达前端小酒馆 1 主要学习JavaScript中的六大原则.那么六大原则还记得是什么了吗?六大原则指:单一职责原则(SRP),开放封闭原则(OCP),里氏替换原则( ...

  7. 21种JavaScript设计模式最新记录(含图和示例)

    最近观看了<Javascript设计模式系统讲解与应用>教程,对设计模式有了新的认识,特在此做些记录. 一.UML 文中会涉及众多的UML类图,在开篇需要做点基础概念的认识.以下面的图为例 ...

  8. javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)

    在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...

  9. javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)

    在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...

随机推荐

  1. SQL Server触发器的基本使用

    sqlserver_SQL触发器的使用及语法(转自:百度文库) 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程 ...

  2. 我的第一个博客&GuiHub简单练习

    个人介绍 姓名:马瑞 性别:男 班级:网络工程143 出生年月:1995.11 兴趣爱好:玩玩电脑,看看动漫. 编程能力:完全是菜鸟.   GutHub的使用体验:  第一步:注册github,这很简 ...

  3. [LeetCode 题解]: Rotate List

    Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1 ...

  4. 重新打造的我的Pugo

    Pugo博客已经搭建了好几个月了吧,给我感受到非常方便的就是,我换了好多VPS,迁移显得非常的方便,但是也有不足的地方,比如发布一篇新的博客,我每次都需要重新进入后台进行新的Post,还需要重新bui ...

  5. Android intent 传值不更新的原因和解决办法

    当 Activity 的启动模式是 singleTask 或者 singleInstance 的时候.如果使用了 intent 传值,则可能出现 intent 的值无法更新的问题.也就是说每次 int ...

  6. 注册IIS的批处理

    新建记事本 输入以下内容 @echo 开始注册Asp.net!%SystemDrive%\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_reg ...

  7. 报错:'utf-8' codec can't decode byte 0xb0 in position 0: invalid start byte

    pandas的read_csv读取一个csv表格,报错. 解决方法:用editplus打开表格,改变编码格式为utf-8,保存,重新读取,通过.

  8. Java中Arrays工具类

    以下是实现六种功能的方法: 1.比较两个数组值是否相等: 结果为true.false.(布尔型不能比较) int []a={10,20,30}; int []b={10,20,30}; int []c ...

  9. Get 和 Post 方法的选择和URL的设计

    原文链接:http://yifei.me/note/540 HTTP 中常用的方法有 GET/POST/PUT/DELETE 等,在设计API或者表单的时候我们需要选择合适的方法.一般有两种方案: 只 ...

  10. Linux 重命名

    例子:将目录A重命名为B mv A B 例子:将/a目录移动到/b下,并重命名为c mv /a /b/c 其实在文本模式中要重命名文件或目录,只需要使用mv命令就可以了,比如说要将一个名为abc的文件 ...