简单的方式


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. Intent之间无法传递大数据的替代方法

    /** * TODO: Activity之间传递list,对象等工具类 * * @author * @date 2014-9-12 下午5:35:38 * @version 0.1.0 */ publ ...

  2. Android自定义属性,format详解

    1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name = "名称"> <attr name = &quo ...

  3. Apache无法启动提示the requested operation has failed

    主要参考这篇 http://apps.hi.baidu.com/share/detail/15868128 但还是遇到一些问题,记录如下: 1. 配置完成后,restart apache,出现 the ...

  4. STL笔记之【map之添加元素】

    //---------------------------------------------------------// 向map中插入元素的方法比较//---------------------- ...

  5. android脚步---不同activity之间参数传递

    现在有两个activity,一个是mainactivity,一个是detectactivity 后者需要调用前者的一个参数,这里用到了intent  getextras(); putextras(); ...

  6. opencv-jni -调试出错taking address of temporary [-fpermissive]

    今天在进行代码往安卓平台移植时,IplImage *qImg=&(IplImage)dst1;报错taking address of temporary [-fpermissive] 百度了一 ...

  7. MyBatis基础用法(一)

    <select id="getErrorTimes" resultType="Integer"> SELECT ErrorTimes FROM `e ...

  8. 最短路径问题 HDU 3790

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  9. ecstore中kvstore之memcached

    memcached的安装 详细见 http://blog.csdn.net/motian06/article/details/17558831 memcached扩展的安装 详细见 http://bl ...

  10. Struts2--默认Action

    何时使用:  访问的网页不存在, 显示错误页面, 或者显示主页. 有时存在一种情况, 就是找不到对应action 可以在struts.xml里设置一个默认的action <?xml versio ...