js 继承【 原型(prototype)】

在学习原型这一节时,理解上花费了不少功夫,不过也有收获。在这里做个笔记,已便日后查看。

js中描述了原型链的概念,并将原型链作为了实现继承的主要方法。基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。我们知道每个构造函数都一个原型对象【包含一个原型对象指针—prototype】,原型对象都包含一个指向构造函数的指针【constructor】,而实例都包含一个指向原型对象的内部指针【[[prototype]] —-一般是不可见的】。那么,加入我们让原型对象【原型对象指针】等于另一个类型的实例,结果会如何呢?显然,此时的原型对象将包含一个指向另一个原型的指针【这一句比较误导人】,相应的,另一个原型中也包含着一个指向另一个构造函数的指针。如此层层推进,就构成了实例与原型的基本链条。
其基本代码如下:

function SuperType(){
    this.property = true;
}

SuperType.prototype.getSuperValue = function(){
    return this.property;
}

function SubType(){
    this.subproperty = false;
}

***SubType.prototype = new SuperType();***

SubType.prototype.getSubValue = function(){
    return this.subproperty;
}

var instance = new SubType();
alert(instance.getSuperValue());//true

以上代码定义了两个类型: SuperType和SubType。每个类型分别有一个属性和一个方法。他们的主要区别是SubType继承了SuperType,而继承是通过创建 SuperType的实例,并将该实例赋给SubType.prototype实现的【代码中*标识那一句】。实现的本质是重写原型对象。代之以一个新类型的实例【也就是SuperType的实例】。换句话说,原来存在于SuperType的实例中的所有属性和方法,现在也存在于SubType.prototype中了。在确立了继承关系后,我们给SubType。prototype一个新方法【getSubValue】,这样就在继承了SuperType的属性和方法的基础上又添加了一个新方法。关系如下图。【其实,当时主要的误区就是这个】
(1)
原书的图

而我自己最初理解上的图应该是这样:(2)
个人修改后的图

而出现这种理解错误的原因在于: prototype是一个指针,它指向的对象是可以变化的(比如在本例中,指向了一个SuperType类型)而在:

SubType.prototype = {
    "name":""
};

这种形式上,又指向了一个Object类型的字面量。
另外一个原因是 对于js中的构造函数,更应该把它当做一个“类”去看待,里面的赋值等等操作看做类中的“默认值”。

SubType.prototype = new SuperType();

这里 new出来的SuperType实例,还是看做一个“静态的模板”比较好理解,如果一直理解为动态的对象,那么就可能绕弯。【ps:思维上毕竟多多少少还是受到了有“类”语言的影响】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值