原型
只要创建了一个对象就会为他创建一个prototype属性,这个属性指向函数的原型对象。在默认情况下,所有原型对象都会自动获得一个constructor属性,这个属性包含一个指向prototype属性所在函数的指针。当用构造函数创建一个新实例时,该实例的内部将包含一个指针,指向构造函数的原型对象,ECMA5管这个指针叫做[[Prototype]],但浏览器上都支持一个属性叫做_proto_
重写原型对象会切断现有原型与之前已经存在的对象实例之间的联系,他们引用的仍然是最初的原型。
原型链
利用原型让一个引用类型继承另一个引用类型的属性和方法。
原型定义共享的constructor和方法,使不同的实例拥有相同的方法;借用构造函数继承实例属性。
实现:prototype
经典的构造函数和原型链的混合模式
拖拽和继承
改写为面向对象形式:
HTML5中的拖放
如何避免原型链上面的对象共享
可以参考经典的extend()函数,很多前端框架都有封装的,就是用一个空函数当做中间变量
作用域链和原型链上的优化
javascript继承的6种方法
1)原型链继承
SubType.prototype= new SuperType();
问题:
l 对象实例共享所有继承的属性和方法。
l 在创建子类型的实例时,不能向父类型的构造函数中传递参数。
原型链的缺点与创建对象的原型模式一样,适合用来继承方法,不适合继承属性。因为一般情况下我们都希望各个实例的属性值是独立的。而且,因为属性是共用的,大家的值都一样,无法针对某个实例去初始化。
不能用对象字面量创建原型方法,因为这样会重写原型链
2)借用构造函数继承(类式继承)
原理:在子类构造函数内部调用父类构造函数。
functionSubType() {
SuperType.call (this);
}
优点:解决了原型链继承的2个问题
问题:方法都在构造函数中定义,函数复用无从谈起。
3)原型+借用构造继承(组合继承)——最常用
原型定义共享的constructor和方法,使原型链的构建:
通过将父类型的实例赋值给子类型构造函数的原型。
SubType.prototype= new SuperType();不同的实例拥有相同的方法;借用构造函数继承实例属性。
优点:既通过在原型上定义方法实现函数复用,又能保证每个实例都有它自己的属性。
4)原型式继承
可以在不必预先定义构造函数的情况下实现继承,其本质是执行对给定对象的浅复制,而复制得到的副本还可以得到进一步改造。
1) 寄生式继承
与原型式继承非常类似,也是基于某个对象或某些信息创建一个对象,然后增强对象,最后返回对象。为了解决组合继承模式由于多次调用超类型构造函数而导致的低效率问题,可以将这个模式与组合继承一起使用。