Javascript Note——继承的实现(一)

Javascript 继承的实现

  1. 原型链方式
        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中成为了共享属性。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值