简单的方式


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. Git学习 -- 删除文件

    1 从版本库删除文件 git rm <file> git commit -m "xxx" 2 工作区中文件被误删,但版本库中没有删除,可以恢复到工作区 git chec ...

  2. mongodb综述

    摘要:mongodb相对于mysql的优势在于性能和分布式扩展方面

  3. C#入门经典(第三章-1)

    #region--------#endregion 此关键字 将设置代码是否可以折叠和展开.但是他们不是C#关键字.注意:带#的是预处理指令,严格说不是C#关键字. 变量:

  4. POJ 1511 Invitation Cards 正反SPFA

    题意:学生从A站到B站花费C元,将学生每天从‘1’号站送往其它所有站,再从所有站接回到‘1’号站,问着个过程最小花费是多少. 思路:因为数据很大所以要用SPFA,因为不仅要从1点连接各个点还要从各个点 ...

  5. '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "AttentionController" nib but the view outlet was not set.'

    问题出现原因: 先创建控制器的.h与.m文件,后来创建了相应的xib文件,运行后出现这个问题. 解决办法:

  6. Myeclipse8.5中svn插件安装方法总结

    [转]http://lwcheng1985.iteye.com/blog/696143   有改动 方法一:在线安装 1.打开HELP->MyEclipse Configuration Cent ...

  7. Button MouseEvent颜色变化

    public partial class Form1 : Form { public Form1() { InitializeComponent(); this.button1.Enter += bu ...

  8. HDU 3265 Posters

    矩形面积并,一个拆成四个 #include<cstdio> #include<cstring> #include<cmath> #include<map> ...

  9. FMDB增删查改

    创建,插入,更新和删除:使用executeUpdate方法,而查询则用executeQuery 1.实例化FMDatabase //paths: ios下Document路径,Document为ios ...

  10. Ubuntu Server 重启 Apache Mysql

    a. 重启 apache sudo service apache2 restart b. 重启 MySQL sudo service mysql restart