- 浏览: 369033 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
surpassno:
很不错,学习了
一个对象占用多少字节? -
ysyzww:
你这么牛逼,你父母知道吗
maven使用技巧 -
妖人不要跑:
JDK中反序列化对象的过程(ObjectInputStream#readObject) -
lanhz:
谢楼主,构建成功了
Mac OSX 10.9 上build openjdk8和openjdk7 -
zqb666kkk:
通过了吗 ?????
淘宝北京专场java面试题(2011-12-31)
本文列举了《JavaScript高级程序设计:第二版》书中讲到的6种创建JavaScript对象的模式,这里有英文版下载。
代码里边用到的一些公用方法本文后边有附。附件为源码。
1、原型链
2、借用构造函数
3、组合继承
4、原型继承
5、寄生继承
6、寄生组合继承
7、拷贝继承
其他代码:
代码里边用到的一些公用方法本文后边有附。附件为源码。
1、原型链
Gmis.inheritance.Animal = function(nickname, legCount, characters) { this.nickname = nickname; this.legCount = legCount; this.characters = characters; } Gmis.inheritance.Animal.prototype = { constructor : Gmis.inheritance.Animal, getNickName : function() { return this.nickname; }, getLegCount : function() { return this.legCount; }, getCharacters : function() { return this.characters; }, getCharacterString : function() { return "[" + (this.characters == undefined ? "undefined" : this.characters.join(",")) +"]"; }, toString : function() { return "nickname: " + this.getNickName() + ", legCount: " + this.getLegCount() + ", charachters: " + this.getCharacterString(); } }; /** * 1、原型链<br> * 优点:继承了超类的方法--在通过new创建实例的时候,已经给实例添加了一个指向原型的属性,对原型方法的调用都是通过该隐藏实例查找过去的<br> * 缺点:<br> * 1、没有继承超类的属性<br> * 2、实例的构造函数是超类的构造函数<br> * * @param {String} type * @param {int} legCount */ Gmis.inheritance.Cat = function(nickname, legCount) { this.nickname = nickname; this.legCount = (legCount == undefined) ? 4 : legCount; }; Gmis.inheritance.Cat.prototype = new Gmis.inheritance.Animal(); var cat = new Gmis.inheritance.Cat("jiafei", 4, ['lovely', 'agile']); Gmis.inheritance.util.printAnimal("1、原型链", cat.toString()); Gmis.util.printMessage("Gmis.inheritance.Cat.prototype.constructor:\n" + Gmis.inheritance.Cat.prototype.constructor); Gmis.util.printMessage("cat.constructor:\n" + cat.constructor); Gmis.util.printMessage("Gmis.inheritance.Cat.prototype.constructor" + (Gmis.inheritance.Cat.prototype.constructor === cat.constructor ? " === " : " !== ") + "cat.constructor: ");
1、原型链 nickname: jiafei, legCount: 4, charachters: [undefined] Gmis.inheritance.Cat.prototype.constructor: function (nickname, legCount, characters) { this.nickname = nickname; this.legCount = legCount; this.characters = characters; } cat.constructor: function (nickname, legCount, characters) { this.nickname = nickname; this.legCount = legCount; this.characters = characters; } Gmis.inheritance.Cat.prototype.constructor === cat.constructor
2、借用构造函数
/** * 2、借用构造函数<br> * 优点:可以继承属性<br> * 缺点:不能继承方法<br> * * @param {String} nickname * @param {int} legCount */ Gmis.inheritance.Dog = function(nickname, legCount) { Gmis.inheritance.Animal.call(this, nickname, legCount); }; Gmis.inheritance.Dog.prototype.toString = function() { return "Dog.... nickname: " + this.nickname + ", legCount: " + this.legCount; }; var dog = new Gmis.inheritance.Dog("huhu", 4); Gmis.inheritance.util.printAnimal("2、借用构造函数", dog.toString());
2、借用构造函数 Dog.... nickname: huhu, legCount: 4
3、组合继承
/** * 3、组合继承--组合借用构造函数和原型链两种方式,各取其利<br> * 优点:<br> * 1、可以继承属性<br> * 2、可以继承方法<br> * 3、子类的构造函数指向子类本身<br> * 缺点:<br> * 1、调用了两次超类构造函数,如下所示,分别在a1、a2出调用了超类构造函数<br> * 2、覆盖超类的方法的时候,没有办法在复用超类方法的基础上添加新的功能,如下toString方法<br> * * @param {String} nickname * @param {int} legCount * @param {String} desc */ Gmis.inheritance.Pig = function(nickname, legCount, characters, desc) { // a1、第二次调用构造函数 Gmis.inheritance.Animal.call(this, nickname, legCount, characters); this.desc = desc; }; // a2、第一次调用构造函数 Gmis.inheritance.Pig.prototype = new Gmis.inheritance.Animal(); Gmis.inheritance.Pig.prototype.constructor = Gmis.inheritance.Pig; Gmis.inheritance.Pig.prototype.getDesc = function() { return this.desc; }; Gmis.inheritance.Pig.prototype.toString = function() { // 如果return this.toString() + ", desc: " + desc;会陷入死循环的,又没有超类的引用,无法super.toString() return "nickname: " + this.getNickName() + ", legCount: " + this.getLegCount() + ", charachters: " + this.getCharacterString() + ", desc: " + this.getDesc(); }; var pig = new Gmis.inheritance.Pig('pipi', 4, ['fat', 'sleepy'], 'lovely'); Gmis.inheritance.util.printAnimal("3、组合继承", pig.toString()); Gmis.util.printMessage("pig.constructor:\n" + pig.constructor);
3、组合继承 nickname: pipi, legCount: 4, charachters: [fat,sleepy], desc: lovely pig.constructor: function (nickname, legCount, characters, desc) { // a1、第二次调用构造函数 Gmis.inheritance.Animal.call(this, nickname, legCount, characters); this.desc = desc; }
4、原型继承
/** * 4、原型继承<br> * 优点:实现简单的拷贝<br> * 缺点: 1、无法扩展<br> * 2、所有实例共用引用类型的属性值<br> * * @param {Object} instance * @return {Object} */ Gmis.inheritance.createSubInstance = function(instance) { var F = function() {}; F.prototype = instance; return new F(); }; var animal = new Gmis.inheritance.Animal('turkey', 2, ['beautiful', 'agile']); var chick = Gmis.inheritance.createSubInstance(animal); var chick2 = Gmis.inheritance.createSubInstance(animal); // 新加的属性也会出现到chick中 chick2.getCharacters().push('fan'); Gmis.inheritance.util.printAnimal("4、原型继承", chick.toString());
4、原型继承 nickname: turkey, legCount: 2, charachters: [beautiful,agile,fan]
5、寄生继承
/** * 5、寄生继承<br> * 优点:可以扩展属性和方法<br> * 缺点:<br> * 1、所有实例共用引用类型的属性值<br> * * @param {Object} instance * @return {} */ Gmis.inheritance.createExtensionSubInstance = function(instance, wingCount) { var F = function(wingCount) { this.wingCount = wingCount }; F.prototype = instance; F.prototype.getWingCount = function() { return this.wingCount; } F.prototype.toString = function() { return "nickname: " + this.getNickName() + ", legCount: " + this.getLegCount() + ", charachters: " + this.getCharacterString() + ", wingCount: " + this.getWingCount(); } return new F(wingCount); }; var animal = new Gmis.inheritance.Animal('quail', 2, ['beautiful', 'agile']); var quail = Gmis.inheritance.createExtensionSubInstance(animal, 2); Gmis.inheritance.util.printAnimal("5、寄生继承", quail.toString());
5、寄生继承 nickname: quail, legCount: 2, charachters: [beautiful,agile], wingCount: 2
6、寄生组合继承
/** * 6、寄生组合继承 -- 通过原型继承方法, 通过借用构造函数继承属性<br> * 优点:<br> * 1、解决5的缺点1,实例不共用引用类型的属性<br> * 2、解决3的缺点1,只调用一次构造函数<br> * 注:Ext.extend用的就是这种方式<br> */ Gmis.inheritance.extend = function(subType, superType) { subType.prototype = Gmis.inheritance.createSubInstance(superType.prototype); subType.prototype.constructor = subType; }; Gmis.inheritance.Rabbit = function(nickname, legCount, characters, desc) { Gmis.inheritance.Animal.call(this, nickname, legCount, characters); this.desc = desc; if (!this.getDesc) { Gmis.inheritance.Rabbit.prototype.getDesc = function() { return this.desc; }; Gmis.inheritance.Rabbit.prototype.toString = function() { return "nickname: " + this.getNickName() + ", legCount: " + this.getLegCount() + ", charachters: " + this.getCharacterString() + ", desc: " + this.getDesc(); }; } }; //不能把这一行代码放在构造函数里边,因为在运行构造函数的开始处已经给实例原型属性赋了值 Gmis.inheritance.extend(Gmis.inheritance.Rabbit, Gmis.inheritance.Animal); var rabbit = new Gmis.inheritance.Rabbit("tutu", 4, ['quick', 'red eyes'], 'desc'); var rabbit2 = new Gmis.inheritance.Rabbit("tutu2", 4, ['quick2', 'red eyes2'], 'desc2'); //这个实例属性的设置不会影响到rabbit实例 rabbit2.getCharacters().push("charachter3"); Gmis.inheritance.util.printAnimal("6、寄生组合继承", rabbit.toString());
6、寄生组合继承 nickname: tutu, legCount: 4, charachters: [quick,red eyes], desc: desc
7、拷贝继承
* 7、拷贝继承--实则是拷贝,可以用来实现多继承 * @param {Object} subInstance * @param {Object} superInstance */ Gmis.inheritance.copyInherite = function(subInstance,superInstance){ for(var name in superInstance){ if(!(name in subInstance)){ subInstance[name] = superInstance[name]; } } } Gmis.inheritance.Racer = function(){ if(!this.run){ Gmis.inheritance.Racer.prototype.run = function(){ return this.nickname + " is running"; } } }; Gmis.inheritance.copyInherite(rabbit,new Gmis.inheritance.Racer()); Gmis.inheritance.util.printAnimal("7、拷贝继承", rabbit.toString() + ", " + rabbit.run());
7、拷贝继承 nickname: tutu, legCount: 4, charachters: [quick,red eyes], desc: desc, tutu is running
其他代码:
Gmis = {}; Gmis.inheritance = {}; Gmis.inheritance.util = {}; Gmis.util = {}; Gmis.inheritance.util.printAnimal = function(type, message) { Gmis.util.printMessage(message == undefined ? type : type + " " + message); }; Gmis.util.printMessage = function(message) { message += "\n"; var output = document.getElementById("output"); output.innerText = output.innerText == null ? message : output.innerText + message; } Gmis.inheritance.Animal = function(nickname, legCount, characters) { this.nickname = nickname; this.legCount = legCount; this.characters = characters; } Gmis.inheritance.Animal.prototype = { constructor : Gmis.inheritance.Animal, getNickName : function() { return this.nickname; }, getLegCount : function() { return this.legCount; }, getCharacters : function() { return this.characters; }, getCharacterString : function() { return "[" + (this.characters == undefined ? "undefined" : this.characters.join(",")) +"]"; }, toString : function() { return "nickname: " + this.getNickName() + ", legCount: " + this.getLegCount() + ", charachters: " + this.getCharacterString(); } };
- inheritance.rar (2.7 KB)
- 下载次数: 5
发表评论
-
Session cookie、持久化Cookie和P3P头在跨域访问时候的行为
2012-08-03 20:24 3118浏览器中,Cookie分为两类,Session Cookie和 ... -
ExtJS与jQuery的一点细节上的对比
2012-02-13 14:22 7582首先说明这不是一篇完整解读ExtJS和jQuery ... -
JavaScript学习之四 — 点滴之匿名函数
2011-09-28 00:44 1633前几天椰子在微博上发了消息说匿名函数也可以有名字,我就想了半天 ... -
JavaScript的instanceof有bug?
2011-01-03 17:08 2331前几天,又是工作上的问题。发现一个对象实例在instanceo ... -
浏览器页面,禁用刷新
2011-01-03 15:37 3023近来工作中遇到一问题,查看单据信息的时候,要禁用刷新功能。这里 ... -
Ext源码解析之二 - ComboBox组件
2010-12-11 00:43 0一、例子二、源码分析三、扩展 -
Ext源码解读之一 -- extend的实现
2010-10-26 23:02 2215先看一个例子: Gmis.ex ... -
JavaScript学习之二 — JavaScript创建对象的8种方式
2010-10-11 22:56 1084本文列举了《JavaScript高级程序设计:第二版》书中讲到 ... -
JavaScript学习之一 — 开发调试工具
2010-10-10 11:42 12891、开发工具 一般使用eclipse的spket插件做 ...
相关推荐
NULL 博文链接:https://raychase.iteye.com/blog/1337415
我们还知道,面向对象编程有三个重要的概念 - 封装、继承和多态。 但是在JavaScript的世界中,所有的这一切特性似乎都不存在。 因为JavaScript本身不是面向对象的语言,而是基于对象的语言。
【JavaScript的9种继承实现方式归纳】js实现继承的几种方式.pdf
JavaScript继承的三种方法实例 继承 继承: 首先继承是一种关系,类(class)与类之间的关系,JS中没有类,但是可以通过构造函数模拟类,然后通过原型来实现继承。 继承也是为了数据共享,js中的继承也是为了实现...
详细介绍了JavaScript中继承的实现方式以及其优缺点分析。
javascript中如何实现封装,继承和多态
大多OO语言都支持两种继承方式: 接口继承和实现继承 ,而ECMAScript中无法实现接口继承,ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现,下文给大家技术js实现继承的六种方式,需要的朋友参考下
JavaScript继承第1种方式:对象冒充;第2种方式:call方法;第3种方式:apply方法;第4种方式:原型链方式;第5种方式:混合方式(推荐)
javascript 五种继承简介。
更有甚者,JavaScript属于使用原型式继承(我们会向你证明这其实是一个极大的优点)的少数语言之一。得益于这种语言的灵活性,你既可使用标准的基于类的继承,也可使用更微妙一些(但也可能更有效一些)的原型式继承...
javascript控件开发之继承关系的源码
JavaScript是如何实现继承的(六种方式)_.docx
本文实例为大家介绍了javascript实现继承的6种方式,分享给大家供大家参考,具体内容如下 1、【原型链继承】实现的本质是重写原型对象,代之以一个新类型的实例。实际上不是SubType的原型的constructor属性被重写了...
浅析Javascript原型继承,浅析Javascript原型继承
javascript用函数实现继承详解javascript技巧docx.docx
使用js实现继承的七种方式,详细讲解了js中的原型链继承,构造函数继承,组合继承(经典继承),原型式继承,寄生式继承,寄生组合式继承,以及ES6中的继承,描述原理以及实现和要点概述等。
javascript中如何实现封装,继承和多态,并有详细,我天天在传谢谢
在JavaScript中,继承可以通过三种手法实现原型链继承 使用apply、call方法 对象实例间的继承。
Javascript中3种实现继承的方法和代码实例_.docx