`
haiyang
  • 浏览: 68958 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

js 继承总结(收藏)

阅读更多

每当我们说到js的继承时,在您的脑袋的第一反应就是prototype原型机制来实现。但是您是否使用过其他的方法来实现继承呢,或者您是否了解其他实现方式及各种不同的继承实现机制的优缺点呢?

好了,下面我们就来看看几种比较常见的继承实现吧。

1、 prototype方式

 1
js 代码
  1.   

这种方式最为简单,只需要让一个类的prototype为被继承的一个实例就ok,然后直接使用BaseClass的方法。

       prototype属性是啥意思呢?prototype即为原型,每一个对象(function 定义出来)都有一个默认的原型属性,该属性是个对象类型。并且该默认属性用来实现链的向上攀查。意思就是说,如果某个对象的属性不存在,那个将通过prototype属性对应的对象的来查找该对象的属性。如果prototype查找不到呢? js会自动地找prototypeprototype属性对应的对象来查找,这样就通过prototype一直往上索引攀查,直到查找到了该属性或者prototype最后为空("undefined");

       例如:上例中的instance.ToString()方法。js会先在instance实例中查找是否有ToString()方法,因为没有,所以查找Derived.prototype属性,prototype NewClass的一个实例,该实例有ToString()方法,于是调用成功;同样给instance name 属性赋值时也是查找prototype来实现的。

       注意,每一个对象得prototype都默认对应一个object对象,但是该对象不等于Object;如何验证呢?看如下代码:

1       var foo = function(){};
2
3       var result = (foo.prototype==Object);

这段代码的result 所得值为 false;

以下几个需要注意:

 1    typeof(Object.prototype) == "object";
 2
 3 
 4
 5       typeof(Object.prototype.prototype) == "undefined";
 6
 7 
 8
 9       var obj = new Object();
10
11       typeof(obj.prototype) == "undefined";
12
13       
14
15       var obj = {};
16
17       typeof(obj.prototype) == "undefined";
18
19 
20
21

2apply方式

 1var BaseClass =function()
 2
 3{
 4
 5    this.name = "3zfp";
 6
 7    this.age = 100;
 8
 9    this.ToString = function(){
10
11        return this.name+" " +this.age;
12
13    }

14
15}

16
17var Derived = function()
18
19
20
21       BaseClass.apply(this,new Array());
22
23    this.address = "ShenZhen";
24
25}

26
27var instance = new Derived();
28
29instance.ToString();
30
31 
32

在这种方式下,我们最需要理解的就是apply函数的作用。

该方法普遍的解释为用A方法去替换B方法。第一个参数为B方法的对象本身,第二个参数为一个数组,该数组内的值集合为需要传递给A方法对应的参数列表,如果参数为空,即没有参数传递,则通过 new Array() 来传递,null无效。

一般的方式为:

但是在本例当中,apply方法执行了两步操作。

 第一:将BaseClassapply传递的Array数组作为初始化参数进行实例化。

第二:将新生成的实例对象的所有属性(nameageToString方法)复制到 instance实例对象。这样就实现了继承。

 1var foo = function()
 2
 3{
 4
 5       this.fooA = function(){
 6
 7              this.fooB.apply(this,new Array("sorry"));
 8
 9       }

10
11       this.fooB =function(str)
12
13       {
14
15              alert(str);
16
17       }

18
19}

20
21new foo().fooA();
22

 3call+prototype 方式

 1var BaseClass =function(name,age)
 2
 3{
 4
 5    this.name = name;
 6
 7    this.age = age;
 8
 9    this.ToString = function(){
10
11        return this.name+" " +this.age;
12
13    }

14
15}

16
17var Derived = function()
18
19
20
21       BaseClass.call(this,"3zfp",100);
22
23    this.address = "ShenZhen";
24
25}

26
27Derived.prototype = new BaseClass();
28
29var instance = new Derived();
30
31instance.ToString();
32
33

       其实,call函数和apply方式有很类似的作用,都是用A方法去替换B方法,但是参数传递不一样,call方法的第一个参数为B方法的对象本身,和面的参数列不用Array对象包装,直接依次传递就可以。

      为什么作用类似,call方式的实现机制却要多一条 Derived.prototype = new BaseClass(); 语句呢?那是因为call方法只实现了方法的替换而没有作对象属性的复制操作。

call方法实际上是做了如下几个操作:

例:

 1var foo = function()
 2
 3{
 4
 5       this.fooA = function(){
 6
 7              this.fooB.call(this,"sorry");
 8
 9       }

10
11       this.fooB =function(str)
12
13       {
14
15              alert(str);
16
17       }

18
19}

20
21new foo().fooA();
22
23

this.fooB.call(this,"sorry")执行了如下几个操作:

1this.temp = this.fooB;
2
3this.temp("sorry");
4
5delete (this.temp);
6

其实,google Map API 的继承就是使用这种方式。大家可以下载的参考参考(maps.google.com)

4prototype.js中的实现方式

 1Object.extend = function(destination, source) {
 2
 3 for (property in source) {
分享到:
评论

相关推荐

    js继承实现示例代码

    js继承实现示例代码,js继承实现示例代码,js继承实现示例代码

    js继承.doc

    javascript做为一门脚本语言,但面向对象思想在其中也有体现,本文档阐述和总结了js中继承的实现,及个方法的利弊!

    JavaScript继承

    在JavaScript中继承是一个非常复杂的话题,比其他任何面向对象的语言中的继承都复杂得多。在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。与它们不同,在JavaScript中要想达到传承公用成员的目的,...

    【JavaScript源代码】深入JS继承.docx

     目录 前言准备总结继承的n种方式原型式继承原型链式继承借用构造函数(类式继承)组合继承寄生组合式继承结束语 前言 准备 总结 继承的n种方式 原型式继承原型链式继承借用构造函数(类式继承)组合继承寄生组合...

    js继承的实现

    js没有特别明确的实现如何继承,但是能够通过特殊手段实现继承的,有四种方法

    Javascript继承机制原理

    Javascript继承机制原理 可以参考下

    JS继承.txtJS继承.txt

    JS继承.txtJS继承.txtJS继承.txtJS继承.txtJS继承.txtJS继承.txtJS继承.txtJS继承.txtJS继承.txt

    js继承的用法

    js继承的用法, function initGrid(){ $('#'+instance.options.table).datagrid(instance.options); } initGrid(); return instance;

    javascript 原生态js类继承实现的方式

    我们还知道,面向对象编程有三个重要的概念 - 封装、继承和多态。 但是在JavaScript的世界中,所有的这一切特性似乎都不存在。 因为JavaScript本身不是面向对象的语言,而是基于对象的语言。

    js javascript zInherit 对象 继承

    js javascript zInherit 对象 继承

    JS继承的实现方式

    JS继承的实现方式转载整理。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    Javascript学习总结

    Javascript学习总结, Javascript学习总结, Javascript学习总结, Javascript学习总结 Javascript学习总结

    javascript 继承派生

    javascript 继承派生等问题的资料,都是网上收集的,学会apply call 就懂js面向对象的原理了。

    javascript课程内容总结

    在课堂上学到的JavaScript进行总结,希望可以帮助更多的人,多多分享自己,从而能互相学习,如果写的有错误的地方也希望大家能指正

    js关键字总结 js关键字总结

    js关键字总结js关键字总结js关键字总结js关键字总结js关键字总结 js关键字总结

    JS总结(大全)

    JS总结JS总结JS总结JS总结JS总结JS总结JS总结JS总结JS总结JS总结JS总结

    javascript中如何实现封装,继承和多态

    javascript中如何实现封装,继承和多态

    javascript 五种继承

    javascript 五种继承简介。

    js常用知识总结经典javascript知识总结,经典javascript知识总结

    经典javascript知识总结.适合有点js基础的,

    javascript 继承学习心得总结

    看了不少js继承的东西也该总结总结了。 先说一下大概的理解,有不对的还望指正,也好更正一下三观。另外说明下,下面的例子并非原创基本就是改了个变量名啥的,有的甚至直接拿过来用的。 js继承是用来干啥的: 首先...

Global site tag (gtag.js) - Google Analytics