关于如何写类, 不管怎么写? 我们都应该明白其原理. 这里倒不是说谁好谁坏的问题.
如果你像ppk 谈 javascript作者那样, 从来不用面向对象思维, 也可以很好的解决问题.
"但是" 出现了.
一个是我们写完的代码, 只有自己用时, 或者只有自己来维护时. 那可以说没有任何问题. 随便咱怎么写. 事实上, 我们的代码有时不完全属于自己的.
另一个是, 我们还要看别人的代码, 所以别人的写法也要懂. 尤其当你想提高时, 去看别人的代码. 如果不懂一些常见概念. 也会看得云里雾里的.
所以要说在 js 中写类的方式时, 我们也要掌握常见的方式.
这里我就说说这两种写类的方式.
1. 构造函数式.
这种方式比较常见. new 构造函数.
- // 人类
- var P = function(name){
- this.name = name;
- };
- P.prototype = {
- //construtor : P,
- sayName : function(){
- alert(this.name);
- }
- };
- // 使用
- var p = new P("laoyao");
- p.sayName();
通过 new 构造函数来得到实例. 实例属性写到构造函数里. 实例方法写到原型里.
既然是类, 还要解决一个问题. 继承的问题. 在 js 中, 由于原型链的机制. 所以继承也是通过原型链方式来的.
比如要写一个子类 Man 来继承 P 类.
就面临两个问题. 怎么继承实例属性和怎么继承原型的属性.
继承实例属性很简单, 应用 call 或 apply 委托来实现就可以, 比如
- // 男人类
- var Man = function(name,sex){
- P.call(this ,name);
- this.sex = sex;
- };
- var man = new Man('laoyao','male');
- alert(man.name);
继承原型属性, 有两种方式,
方式一, 让 Man 的 prototype 指向一个空对象, 此对象构造函数的 prototype 指向 P 的原型. 如下的 extend 函数
- function extend(sub,sup){
- var F = function(){};
- F.prototype = sup.prototype;
- sub.prototype = new F();
- // 还原父类的 constructor
- if(sup.prototype.construtor != sup){
- sup.prototype.constructor = sup;
- }
- }
简单看一下, extend 传进来两个参数, 注意参数是两个函数. 使用如下
- // 男人类
- var Man = function(name,sex){
- P.call(this ,name);
- this.sex = sex;
- };
- extend(Man,P);
- Man.prototype.saySex = function(){
- alert(this.sex);
- };
- // 使用
- var me = new Man('laoyao','male');
- me.sayName();
- me.saySex();
代码片段 6
来源: http://www.qdfuns.com/article/17398/2287faf5de00383387d953fe679707e8.html