一、原型链

ECMAScript中将原型链作为实现继承的主要方法,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.

实例1:

function SupType() {
this.property = true;
} SupType.prototype.getSupvalue = function() {
return this.property;
}; function SubType() {
this.subproperty = false;
} //原型对象等于一个类型的实例
SubType.prototype = new SupType(); SubType.prototype.getSubValue = function() {
return this.subproperty;
}; var instance = new SubType();
alert(instance.getSupvalue());//true

 

原理分析:

javascript中继承的原理是通过原型让一个引用类型继承另一个引用类型的属性和方法,当一个原型对象等于一个引用类型的实例(就如同将一个对象赋值给另一个对象一样,此时被赋值的对象就拥有了这个对象的属性或方法),此时这个原型对象就拥有了这个实例所拥有的属性或方法.

SupType的实例中包含一个指向原型对象的内部指针和一个属性property,SupType的实例被赋值给了SubType原型对象,现在SubType原型对象中就包含了指向SupType原型对象的内部指针和property属性.此时SubType的实例对象就可以访问到SupType构造函数中的方法getSupvalue,当前getSupvalue中的this指向的是SubType的实例对象,所以最后得到的结果为true.

理解javascript中的原型模式 ,理解了原型模式就很好理解javascript中的原型链,从而就很好理解JavaScript中的继承.

二、继承中定义方法的2个规则.

1.当子类型要重写超类型中的方法或是要为超类型添加不存在的方法时,给原型添加方法的代码必须放在替换原型的语句之后.

实例1:

function SupType() {
this.property = true;
} SupType.prototype.getSupvalue = function() {
return this.property;
}; function SubType() {
this.subproperty = false;
} //原型对象等于一个类型的实例
SubType.prototype = new SupType(); SubType.prototype.getSupvalue = function() {
return false;
}; SubType.prototype.getSubValue = function() {
return this.subproperty;
}; //SubType.prototype = new SupType(); var instance = new SubType();
alert(instance.getSupvalue());//false

子类型重写了超类型中的方法,因此会屏蔽原来的方法,最后返回的结果为false.

实例2:

如果将SubType.prototype = new SupType();这段替换原型的语句放在给原型添加方法的后面,上面最后得到的结果为true.

function SupType() {
this.property = true;
} SupType.prototype.getSupvalue = function() {
return this.property;
}; function SubType() {
this.subproperty = false;
} //原型对象等于一个类型的实例
//SubType.prototype = new SupType(); SubType.prototype.getSupvalue = function() {
return false;
}; SubType.prototype.getSubValue = function() {
return this.subproperty;
}; SubType.prototype = new SupType(); var instance = new SubType();
alert(instance.getSupvalue());//true
alert(instance.getSubValue());// instance.getSubValue is not a function

  如果是先给子类型的原型添加方法,然后再将超类型的实例赋值给子类型的原型,那么子类型的原型就被这个超类型的原型重写了,子类型中的方法都不再存在,现在子类型的原型指向的是超类型的原型对象,调用方法instance.getSupvalue()是超类型中的方法返回true.

2.通过原型链实现继承时,不要用字面量创建原型方法,这样会重写原型链.

实例:

function SupType() {
this.property = true;
} SupType.prototype.getSupvalue = function() {
return this.property;
}; function SubType() {
this.subproperty = false;
} //原型对象等于一个类型的实例
SubType.prototype = new SupType(); //SubType.prototype.getSupvalue = function() {
// return false;
//}; //SubType.prototype.getSubValue = function() {
// return this.subproperty;
//}; SubType.prototype = {
getSubvalue: function() {
return this.subproperty;
}
}; var instance = new SubType();
alert(instance.getSupvalue());
alert(instance.getSubValue());

测试结果: 

 

重写原型链切断了子类型和超类型之间的关系(SubType和SupType现在没有了关系).

JavaScript中的继承(原型链)的更多相关文章

  1. JavaScript 中实现继承的方式(列举3种在前一章,我们曾经讲解过创建类的最好方式是用构造函数定义属性,用原型定义方法。)

    第一种:对象冒充 function ClassA(sColor) { this.color = sColor; this.sayColor = function () { alert(this.col ...

  2. Javascript 组合继承 原型链继承 寄生继承

    Javascript继承通常有三种方式. 第一种:组合式继承: function SuperType(name) { this.name = name; this.colors = ["re ...

  3. JavaScript学习13 JavaScript中的继承

    JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript"> //继承第一种方式 ...

  4. 浅谈JavaScript中的继承

    引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原 ...

  5. 彻底搞懂JavaScript中的继承

    你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...

  6. 关于JavaScript中实现继承,及prototype属性

    感谢Mozilla 让我弄懂继承. JavaScript有八种基本类型,函数属于object.所以所有函数都继承自object.//扩展:对象,基本上 JavaScript 里的任何东西都是对象,而且 ...

  7. javascript中各种继承方式的优缺点

    javascript中实现继承的方式有很多种,一般都是通过原型链和构造函数来实现.下面对各种实现方式进行分析,总结各自的优缺点. 一 原型继承 let Super = functioin(name = ...

  8. javascript中实现继承的几种方式

    javascript中实现继承的几种方式 1.借用构造函数实现继承 function Parent1(){ this.name = "parent1" } function Chi ...

  9. 深入理解JavaScript中的继承

    1前言 继承是JavaScript中的重要概念,可以说要学好JavaScript,必须搞清楚JavaScript中的继承.我最开始是通过看视频听培训班的老师讲解的JavaScript中的继承,当时看的 ...

随机推荐

  1. css学习笔记 2

    css中的简写: 颜色的简写有三种:十六进制的形式.rgb(a).颜色名称. 单位的省略:当属性值为0px时,可以简写为0. margin和padding的简写,不多说了. border的简写:bor ...

  2. Copy List with Random Pointer [LeetCode]

    A linked list is given such that each node contains an additional random pointer which could point t ...

  3. 对checkbox 的checked的一些总结

    在做一个jquery树形结构的复选框选择的效果. 遇到的问题: 1.jquery复选框判断是否被选中 $(check).attr("checked"),可能提示为undefied: ...

  4. 樱花漫地集于我心,蝶舞纷飞祈愿相随---总结 适者:survival of the fittest 适者:survival of the fittest

    编程什么的最讨厌了,总是忘记一些乱七八糟的,看起来并没有什么乱用的,比如(::“<>{}, 还有交作业的时候总是忽略大小写<(▰˘◡˘▰)> 马马虎虎莫名其妙就错了,其实大小写 ...

  5. Gridview布局界面练习Base Adapter

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZcAAAJVCAIAAACdzC94AAAgAElEQVR4nOy953Ij2bGuLTVJmFrelf

  6. vector 的 push_back[转]

    vector是用数组实现的,每次执行push_back操作,相当于底层的数组实现要重新分配大小(即先free掉原存储,后重新malloc):这种实现体现到vector实现就是每当push_back一个 ...

  7. c/c++面试题(3)strcat/strcmp/strlen/strcpy的实现

    1.编写一个函数实现strlen以及strcpy函数. strcpy函数. 后面的字符串拷贝到一个字符数组中,要求拷贝好的字符串在字符数组的首 地址,并且只拷贝到'\0'的位置.原型是 char* m ...

  8. checkbox选中与取消选择

    先上代码 <form> 你爱好的运动是?<br/> <input type="checkbox" name="items" val ...

  9. BZOJ 2763 分层图最短路

    突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 #include <cstdio> #include <algorithm> #include ...

  10. android 检测网络是否连接,或者GPS是否可用

    很多android程序在打开时,检测网络是否连接,或者GPS是否可用: 1.网络是否连接(包括Wifi和移动网络) // 是否有可用网络 private boolean isNetworkConnec ...