js类式继承的实现
2014-03-06 16:02
295 查看
下面提供js实现继承的三种方法:类式继承,原型继承,掺元类。这里先简述类式继承,后两种在往后的随便中简述,请多多关注、指导,谢谢。
类式继承。
js类式继承的实现依靠原型链来实现的。什么是原型链?js中对象有个属性prototy,这个属性返回对象类型的引用,用于提供对象的类的一组基本功能。
貌似对prototype有印象,对了,我们经常这样用代码。
在理解原型后,需要理解下什么是原型链。在访问对象的某个成员(属性或方法)时,如果这个成员未见于当前对象,那么js会在prototype属性所指的那个对象中查找它,如果还没有找到,就继续到下一级的prototype所指的对象中查找,直至找到。如果没有找到就会返回undifined。
那么原型链给我们什么提示呢?很容易联想到,原型链意味着让一个类继承另一个类,只需将子类的prototype设置为指向父类的一个实例即可。这就把父类的成员绑定到子类上了,因为在子类上查找不到某个成员时会往父类中查找。(以上这两段用词不严谨,只在用通俗易懂的言语描述)
下面我们需要个Chinese类,需要继承Person类的name和getName成员。
这是因为在上面的代码Chinese.prototype = Person.prototype; 这是引用类型,修改Chinese同时也修改了Person。这本身就是不能容忍的,且使类之间形成强耦合性,这不是我们要的效果。
我们可以另起一个对象或实例化一个实例来弱化耦合性。
到此,完了嘛,还没有!在对象的属性prototype下面有个属性constructor,它保存了对构造特定对象实例的函数的引用。根据这个说法Chiese.prototype.constructor应该等于Chinese,实际上不是。
回忆之前在设置Chiese的原型链时,我们把Person.prototype 覆盖掉了Chiese.prototype。所以此时的Chiese.prototype.constructor是Person。我们还需要添加以下代码
在一楼的评论下,我对那个extend函数又有新的看法。之前在讨论如何设置原型链时提出了两种方法
然而用第一种方法的话可以减少在Chinese中再写Person.call(this,name);,这部分代码在子类中往往会遗忘。不妨把这种功能代码放在了extend里。就只写
Chinese.prototype = new Person();也达到同样的目的:耦合不强。
但遗忘的一点是,Chinese.prototype = new Person();这样写对嘛。答案是不对!很明显 new Person()需要传一个name参数的。我们不可能在extend函数里做这部分工作,只好在Chinese类里调用父类的构造函数了。这样也符合面向对象的思路。
所以,还是力荐用第二种方法。
第一次这样写有关技术类的文章,基本是按自己的思路铺展开来,难免会有一些没有考虑到的地方和解释的不清楚的地方,望留言反馈,谢谢。
相关文章推荐
- js类式继承的实现
- js类式继承的具体实现方法
- js类式继承的实现
- js类式继承的具体实现方法
- js类式继承的实现 非常重要
- js类式继承的实现
- js类式继承的具体实现方法
- Java程序员从笨鸟到菜鸟之(二十九)javascript对象的创建和继承实现
- PHP接口多继承及tarits实现多继承效果的方法
- C++接口继承与实现继承的区别和选择
- UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
- 使用 ASM 实现 Java 语言的“多重继承”
- Contoso 大学 - 8 – 实现继承
- UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
- java中继承Thread 和实现Runnable的区别
- ECMAScript 继承机制实现
- JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
- Flex实现组件自定义倒影效果之二:继承于Effect
- ECMAScript 继承机制实现