JS继承-ES5

89 阅读2分钟

一.原型链

设置构造函数的原型对象为某对象实例,即可继承该对象实例的原型链及其方法和属性。

确定原型和实例的关系

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);
};