简单的方式


function Person() {
this.name = 'person';
}
Person.prototype.say = function() {}; function Child() {
this.name = 'child';
}
Child.prototype = new Person(); var child = new Child();

缺点:其实child并不需要person里面的name属性

借用构造函数


function Person() {
this.name = 'person';
}
Person.prototype.say = function() {}; function Child() {
Person.call(this, arguments)
} var child = new Child();

缺点:仅会复制父类对象的属性作为子类自身的属性, 仅仅是复制**

优点:可以获得父对象自身的真实副本,子类和父类没有关系,不会影响到父类**

借用构造函数是实现多继承

function CatWings() {
Cat.call(this, arguments)
Brid.call(this, arguments)
}

借用构造函数和实现原型


function Person() {
this.name = 'person';
}
Person.prototype.say = function() {}; function Child() {
Person.call(this, arguments)
// this.name = 'child'
} Child.prototype = new Person() var child = new Child();
delete child.name;
// 可以看到访问:child.name的是prototype的

name属性被继承了2次

缺点:所有从Person继承的类,都是可以更改到Person的原型方法

临时构造函数

function inherit(Child, Parent) {
var F = function(){}
F.prototype = Parent.prototype;
Child.prototype = new F();
// Child.prototype.constructor = Child
// Child.superclass = Parent.prototype;
} // 每次都要创建一个空的F
var inherit = (function(){
var F = Function(){};
return function() {
F.prototype = Parent.prototype;
Child.prototype = new F();
// Child.prototype.constructor = Child
// Child.superclass = Parent.prototype;
}
})();

Klass

var Klass = function (Parent, props) {

    if(props == undefined && typeof Parent == 'object') {
props = Parent;
Parent = null;
} Parent = Parent || {};
props = props || {}; var Child = function() {
if(Child.superclass.hasOwnProperty('__construct')) {
Child.superclass['__construct'].apply(this, arguments);
} if(Child.prototype.hasOwnProperty('__construct')) {
Child.prototype['__construct'].apply(this, arguments);
}
}; var F = function() {};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.superclass = Parent.prototype; for(var i in props) {
if(props.hasOwnProperty(i)) {
Child.prototype[i] = props[i];
}
}
return Child;
} function Animal() {} Animal.prototype.__construct = function(name) {
this.name = name
}; Animal.prototype.getName = function() {
return this.name;
}; var Dog = Klass(Animal, {
__construct: function(name, age) {
this.age = age;
},
run: function() {
console.log('My name is %s, I\'m %s years old , I\'m Running', this.getName(), this.age);
}
}); var dog = new Dog('xixi', 26)

5)Javascript设计模式:extends模式的更多相关文章

  1. javascript 设计模式-----策略模式

    在<javascript设计模式>中,作者并没有向我们介绍策略模式,然而它却是一种在开发中十分常见的设计模式.最常见的就是当我们遇到一个复杂的表单验证的时候,常常需要编写一大段的if和el ...

  2. JavaScript设计模式 - 迭代器模式

    迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺 ...

  3. JavaScript设计模式 - 代理模式

    代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问 代理模式的用处(个人理解):为了保障当前对象的单一职责(相对独立性),而需要创建另一个对象来处理调用当前对象之前的一些逻辑以提高代码的效 ...

  4. javascript设计模式——组合模式

    前面的话 在程序设计中,有一些和“事物是由相似的子事物构成”类似的思想.组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成的.本文将详细介绍组合模式 宏命令 宏 ...

  5. JavaScript设计模式-组合模式(表单应用实现)

    书读百遍其义自见 <JavaScript设计模式>一书组合模式在表单中应用,我问你答答案. 注:小编自己根据书中的栗子码的答案,如有错误,请留言斧正. 另:如有转载请注明出处,谢谢啦 &l ...

  6. javascript设计模式——模板方法模式

    前面的话 在javascript开发中用到继承的场景其实并不是很多,很多时候喜欢用mix-in的方式给对象扩展属性.但这不代表继承在javascript里没有用武之地,虽然没有真正的类和继承机制,但可 ...

  7. javascript 设计模式-----工厂模式

    所谓的工厂模式,顾名思义就是成批量地生产模式.它的核心作用也是和现实中的工厂一样利用重复的代码最大化地产生效益.在javascript中,它常常用来生产许许多多相同的实例对象,在代码上做到最大的利用. ...

  8. javascript设计模式-组合模式

    组合模式所要解决的问题: 可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象. 客户端代码必须区别对象简单对象和 ...

  9. javascript设计模式——策略模式

    前面的话 在程序设计中,常常遇到类似的情况,要实现某一个功能有多种方案可以选择.比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法.这些算法灵活多样,而且可以随意互相替换.这种解决方 ...

  10. javascript设计模式——迭代器模式

    前面的话 迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示.迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也 ...

随机推荐

  1. Python -- OOP高级 -- 定制类

    __str__ 和 __repr__ :实例对象直接显示字符串 class Student: def __init__(self, name): self.name = name def __str_ ...

  2. HDU 1043 八数码(八境界)

    看了这篇博客的讲解,挺不错的.http://www.cnblogs.com/goodness/archive/2010/05/04/1727141.html 判断无解的情况(写完七种境界才发现有直接判 ...

  3. 忘了SA密码的SQL SERVER

    [暂时还未验证] SQL2008  如果 本地连接登录补上,也忘了Sa等管理账号的密码,可以通过单用户连接的方式登录 http://msdn.microsoft.com/zh-cn/library/m ...

  4. 一个appium 博客

    http://www.cnblogs.com/tobecrazy/category/699177.html appium Java控制Appium server start/stop 摘要: 相信很多 ...

  5. C#入门经典(3-窗体应用程序-第二章要点)

    新建一个窗体用用程序,拖一个按钮,加事件和Text属性.打开Form1Designer.cs.

  6. angular 实现modal windows效果(即模态窗口,半透明的遮罩层),以及bootstrap(css,components,js)的初步学习

    废话不说,直接上代码.可直接看效果,对着分析..今天算是bootstrap 入门了,开心.. 突然居然很多事情就是那样,不要太多的畏惧,迈出第一步其实就成功了一半了. <html ng-app= ...

  7. HQL中左连接,右连接,内连接

    左连接:left join 如A left join B 即取出A表的所有数据,由on条件关联的B表数据,有则显示,没有则为空: 右连接:right join 如 A right join B 即取出 ...

  8. [转]android中解析后台返回的json字符串

    普通形式的:服务器端返回的json数据格式如下: {"userbean":{"Uid":"100196","Showname&qu ...

  9. Python大神成长之路: 第一次学习记录

    一.Python发展史 二.Python2 or 3 博主选择了Python3. 从官网下载Python  www.python.org Windows安装python3.5.python2.7.安装 ...

  10. spring和springMVC的上下文

    上下文可以替代注解, 但是注解更方便 package com.tgb.web.controller; import javax.annotation.Resource; import javax.se ...