一.原型链
设置构造函数的原型对象为某对象实例,即可继承该对象实例的原型链及其方法和属性。
确定原型和实例的关系
1.**instanceof:**instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。
2.isPrototypeOf
原型链的问题:
1.原型中属性被所有该原型类型的实例共享,实例没有自己独立的属性(特别是引用类型的属性,因为引用类型是通过地址访问,某对象改变其引用类型的属性,与它共享一个原型的对象的该引用属性值也会发生变化。)
2.:在创建子类型的实例时,不能向超类型的构造函数中传递参数。即使传递了参数也无法实现拥有独立的属性,因为超类型是原型,其属性被所有该原型类型的实例共享。
二.借用构造函数
函数只不过是在特定环境中执行代码的对象
实现原理:在构造函数中利用call,apply调用超类构造函数,将超类构造函数的执行环境对象设为实例对象。(this)
类数组对象:拥有length,可以通过索引访问。{'length': 2, '0': 'eat', '1': 'bananas'}
借用构造函数的问题:
无法复用
三.组合继承
构造函数中借用超类的构造函数,继承超类的属性(可通过穿参实现自定义继承);将原型对象设为超类实例,继承超类的方法。
四.原型式继承
原型链继承的简略实现方式,适用于创建一个继承某对象的新对象,这种创建往往只使用一次,可以使用原型式继承。
function object(o){
function F(){}
F.prototype = o;
return new F();
}
Object.create()方法:
参数:(1)被继承的对象 (2)自定义对象属性:格式与defineProperties参数相同
五.寄生式继承
寄生:在继承对象基础上进行自定义改造,用函数封装。
function createAnother(original){
var clone = object(original); //通过调用函数创建一个新对象
clone.sayHi = function(){ //以某种方式来增强这个对象
alert("hi");
};
return clone; //返回这个对象
六.寄生组合式继承
组合式继承需要两次实例化超类,导致实现继承后实例出的对象拥有两份超类属性(实例对象上,原型上)。原型其实无需具有超类属性,因此可以将超类的原型处理后作为原型,即可实现目标。对超类原型的处理即为寄生继承形式。
function inheritPrototype(subType, superType){
var prototype = object(superType.prototype); //创建对象
prototype.constructor = subType; //增强对象
subType.prototype = prototype; //指定对象
}
function SuperType(name){
this.name = name;
this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function(){
alert(this.name);
};
function SubType(name, age){
SuperType.call(this, name);
this.age = age;
}
inheritPrototype(SubType, SuperType);
SubType.prototype.sayAge = function(){
alert(this.age);
};