JavaScript继承主要是两种形式:
1. 原型链继承
2. 拷贝继承
注:ES7标准中的class就暂时不考虑了,因为还没有具体去了解过,希望以后能完善到不需要自己实现那么那么蛋疼的东西了。
我个人倾向于原型链继承,因为原型链继承是JavaScript规范里面推荐的继承,并且最重要的是,可以用原生的 instanceof 判断类型!而拷贝继承不行!
因为以上的一些问题,所以我就自己做了一个简单的JavaScript面的对象库。大概有实现这么几个功能:
1. 封装好的构造函数不管写不写new操作符都不会产生错误了,当然我是倾向于不写new操作符。
2. 返回的构造函数是命名的,方便调试的时候追踪函数栈。
3. 封装了一个parent方法,可以方便访问父原型的构造函数或者父原型的方法。
4. 封装了一个alias方法,可以创建一个方法别名。
具体实现在具体实现在github上 >> 代码传送门
接下来来看一些简单的示例来看看怎么用。
// 首先定义一个Animal类(姑且称为类吧),继承自Objec,有一个构造函数。
var Animal = BlxClass.extend('Animal', Object, function(name, sound){
this.name = name || null;
this.sound = sound || null;
});
Animal.prototype.call = function(){
console.log(this.sound);
};
// 现在我希望定义一个doge类,继承自Animal。第一个参数 ‘Doge’ 是用来给构造函数命名的。
var Doge = BlxClass.extend('Doge', Animal, function(name){
var sound = 'wang';
BlxClass.parent(this, Doge, [name, sound]); // 调用父类的构造函数,因为初始化对象属性在父类构造函数里。
});
Doge.prototype.wang = BlxClass.alias('call');
// 现在实例化一个doge对象
var doge = Doge('Tom'); // 有没有 new 都没关系,结果相同。
doge.call(); // =>'wang'
doge.wang(); // =>'wang'
然后这样就跟其他语言类的继承大致相似了。然后大家更喜欢哪一种继承方式呢?都来说说自己看法吧。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.