当你初学编程的时候,一定遇到过“面向对象”这个名词。查遍网络,总结下来它就是一个潮词儿:把数据装进带有属性的对象。
面向对象的关键词就是类,你使用constructor和几个私有和公有函数创建类。
一直到ES2015以前,js这门语言并没有实行类。而是使用原型链。而新的ES6“class”,其实只是一个语法糖---它的内部工作的其实仍旧是原型链。
究竟什么是原型链?一切没有例子的编程理论都是耍流氓,请看例证:
第一步,创建constructor
function Bat(name){
this.name = name;
}
let bob = new Bat('bob');
复制代码
第二步,赋值
每一个初始化的constructor都会有一个prototype对象作为它的属性。我们可以给它设置key 和value
Bat.prototype.fly = function(){
console.log('Im flying. Weeee');
};
Bat.prototype.detect = function(){
console.log('I found a mouse!');
};
复制代码
第三步,打印bob查看
此时,你可以看到bob里面是一个Bat对象,而对象的__proto__ 多了detect和fly函数。我们给这个类加了两个方法,但并没有去修改类的原始定义。这就是原型链的继承性。
第四步,验证。
当我们输出bob.name时,得到的是‘bob’;当我们输出bob.fly()时,得到的是Im flying. Weeee’。 那么问题来了,为什么我们没有调bob.prototype.fly()就能得到fly()呢?
这就是原型链的一个特性了:js引擎会首先查找本身对象,如果没有,就去找第一个原型,然后下一个...然后下一个...直到找到为止或者直到碰到null