Javascript 继承的实现
- 原型链方式
ECMAScript中描述了原型链的概念,原型链是指当创建一个函数时,会为该函数生成原型对象,函数中包含一个指向原型对象的指针,即prototype属性;而在原型对象中也有一个属性指向其所对应的函数,即constructor属性,而每一个该函数的对象实例中都包含一个内部属性[[prototype]],来指向该函数的原型对象。当对象实例使用某个属性或者方法时,首先会在对象实例里查找,如果没有找到就会根据其内部属性[[prototype]]指引在函数的原型对象(prototype属性)中查找,然后依次按照原型对象的链接查找上去,这也是把函数的公共属性和方法定义在原型对象的原因。原型链为实现继承的主要方法。其基本思路是利用原型让一个引用类型来继承另一个引用类型的属性和方法。
原型链的基本实现模式
function SuperType(){
this.superProperty = true;
}
SuperType.prototype.getSuperProperty = function(){return this.superProperty;};
function SubType(){
this.subProperty = false;
}
//继承了SuperType
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.getSubProperty = function(){return this.subProperty;};
var instance = new SubType();
//true
console.log(instance.getSuperProperty());
原型链的基本实现图解1-1
可以通过instanceof操作符和isPrototypeOf()方法来确定,实例对象与原型链中构造函数的关系
console.log(instance instanceof Object); // true
console.log(instance instanceof SuperType); // true
console.log(instance instanceof SubType); // true
console.log(Object.prototype.isPrototypeOf(instance)); //true
console.log(SuperType.prototype.isPrototypeOf(instance)); // true
console.log(SubType.prototype.isPrototypeOf(instance)); // true
原型链方式实现的继承也有其不可不避免的缺点:
1. 使用原型链方式实现的继承,创建子类时无法向父类的够在函数传递参数;
2. 由于子类的原型对象(prototype)实际上为父类的一个对象实例,所以在父类中的实例属性将会成为子类型的原型属性被所有子类型实例所共享。以上面的实例来说SuperType中的实例属性superProperty的值会因为任意一个SubType对象实例的修改而作用于所有SubType的实例。因为通过原型链方式的继承,superProperty已经成为SubType类型的原型实例,存在于SubType的Prototype中成为了共享属性。
- 原型链方式
ECMAScript中描述了原型链的概念,原型链是指当创建一个函数时,会为该函数生成原型对象,函数中包含一个指向原型对象的指针,即prototype属性;而在原型对象中也有一个属性指向其所对应的函数,即constructor属性,而每一个该函数的对象实例中都包含一个内部属性[[prototype]],来指向该函数的原型对象。当对象实例使用某个属性或者方法时,首先会在对象实例里查找,如果没有找到就会根据其内部属性[[prototype]]指引在函数的原型对象(prototype属性)中查找,然后依次按照原型对象的链接查找上去,这也是把函数的公共属性和方法定义在原型对象的原因。原型链为实现继承的主要方法。其基本思路是利用原型让一个引用类型来继承另一个引用类型的属性和方法。
原型链的基本实现模式
function SuperType(){ this.superProperty = true; } SuperType.prototype.getSuperProperty = function(){return this.superProperty;}; function SubType(){ this.subProperty = false; } //继承了SuperType SubType.prototype = new SuperType(); SubType.prototype.constructor = SubType; SubType.prototype.getSubProperty = function(){return this.subProperty;}; var instance = new SubType(); //true console.log(instance.getSuperProperty());
原型链的基本实现图解1-1
可以通过instanceof操作符和isPrototypeOf()方法来确定,实例对象与原型链中构造函数的关系
console.log(instance instanceof Object); // true
console.log(instance instanceof SuperType); // true
console.log(instance instanceof SubType); // true
console.log(Object.prototype.isPrototypeOf(instance)); //true
console.log(SuperType.prototype.isPrototypeOf(instance)); // true
console.log(SubType.prototype.isPrototypeOf(instance)); // true
1. 使用原型链方式实现的继承,创建子类时无法向父类的够在函数传递参数;
2. 由于子类的原型对象(prototype)实际上为父类的一个对象实例,所以在父类中的实例属性将会成为子类型的原型属性被所有子类型实例所共享。以上面的实例来说SuperType中的实例属性superProperty的值会因为任意一个SubType对象实例的修改而作用于所有SubType的实例。因为通过原型链方式的继承,superProperty已经成为SubType类型的原型实例,存在于SubType的Prototype中成为了共享属性。