天天看点

JavaScript是如何实现继承

前言:大多oo语言都支持两种继承方式: 接口继承和实现继承. 而ecmascript中无法实现接口继承,ecmascript只支持实现继承. 而且其实现继承主要是依靠 原型链 来实现。

每个构造函数都有一个原型对象

原型对象包含一个指向构造函数的指针(这句话特别重要)

实例都包含一个指向原型对象的内部指针

每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针(prototype),而实例则包含一个指向原型对象的内部指针(proto)。

基本思想:利用原型,让一个引用类型继承另外一个引用类型的属性和方法。 可以简单的理解为,让当前类的原型对象 = new other(); 这样原型对象包含一个指向构造函数的指针,就是指向父类new的构造指针。 所有父类的this相当于就是子类的this啦,父类的属性方法会被覆盖。

例子:

基本思想:在子类型构造函数的内部调用超类构造函数. 通过使用call()和apply()方法可以在新创建的对象上执行构造函数 因为call和apply方法的目的就是复用当前存在类中的方法或者属性,构造也是不在话下 所以父类中的this被改变为当前类的this,然后执行环境就是当前的执行环境。 总之call和apply既可以用到构造函数里面也可以用到普通函数里面 但有一点是他们都不能继承原型链(不能继承原型链) 估计和new不一样吧,使用new的时候会把当前构造函数的原型对象指向this指针 但是call的时候没有原型对象所以原型的方法不能够去调用

但是不能调用父类的原型方法,比如:

估计是一个函数就一个原型对象,在构造中在此使用原型对象不太合理。

这个我还得看看书,慢慢的理解。

第一使用原型链的时候不可以向父类传递参数。 第二使用借用构造的时候不能继承原型链。 所有结合一起的意思就是既可以访问原型链,又可以向父类传递参数。

优势:可以传递参数,可以访问原型链

基本想法:借助原型可以基于(已有)的对象创建新对象,同时还不必须因此创建自定义的类型。 我自己的理解,将一个已经创建好的对象的属性和方法放置在心创建的对象的原型指针上。 创建一个对象:console.dir()可以显示一个对象所有的属性和方法。

原型式继承:将已经创建好的对象的所有属性全部放置在新的对象的原型指针上

测试:

总结:感觉这个很第一个利用原型链一样的,只是一个是创建好的对象,一个是没有创建的对象,实质是一样的。最好自己通过控制台打出来自己看一下,方便理解。

再次理解将person改变一下:

测试2:

ecmascript5通过新增object.create()方法规范化了原型式继承。 这个方法接收两个参数: 一个用作新对象原型的对象 一个作为新对象定义额外属性的对象。

例子:自己打印出来看看!

基本思想:创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真正是它做了所有工作一样返回对象。

先看个例子:

ojbject 函数将person的属性等全部放置在原型链上,有点像原型链式的继承。

原型链的例子:

将对象以前的方法继承下来,放置在原型链上,然后在增加新的方法增强以前的对象,返回新的对象。 打印出来是否发现两个不一样,一个在原型链上,一个在对象的属性上
基本思想:通过借用函数来继承属性,通过原型链的混成形式来继承方法 两个定义好的函数,用来继承,并不是用对象来实现继承,和之前讲的混合模式一样。

http://www.jb51.net/article/75714.htm

http://www.jb51.net/article/81766.htm

javascript:void(0)

继续阅读