第一节 原型基础
转眼之间接触JavaScript这门语言有一年多,在工作中用的都是其开发的框架。原生的JavaScript在项目中基本很少用到。在此利用工作之余,总结最近所学,如有不妥之处,望各位批评指正。
原型:
1.原型是什么?
在JavaScript中所有的函数和对象都有原型这个属性,我们称为原型对象(prototype)。
2.原型都有什么内容?
在每个原型对象中,都存在原型指针指向其构造函数。实例都包含一个指向其对象内部指针。
Array.prototype ==>指向了他的构造函数
var a=new Array()
a._proto_ ==>指向了其对象的内部
a._proto_ === Array.prototype ==>返回值为true
3.原型在JavaScript起到了什么作用
本章不多说,涉及到原型链。下章节详细整理下。
原型在JavaScript中会形成原型链,而原型链是JavaScript中实现继承的基础。在现如今许多常用的JavaScript开发中原型链思想早已深入众多开发者的习惯之中。
4.原型设计的优缺点
缺点:因能力太弱暂时未发现
优点:1)函数生成的实例所拥有的方法都是指向一个函数的索引,这样可以节省内存。(相对于一般构造函数而言)
2)修改父类的原型可以动态修改所有已经创造的实例(是把双刃剑,看你会不会用)
3)可以动态修改一个对象的原型
第二节 原型的作用
上一小节简单介绍了原型的基本知识,本节将接着上节来讲原型在JavaScript这门语言中起到的作用。
JavaScript是一门面向对象的语言,既然如此那就肯定少不了面向对象的基本特性继承。不同Java/c#这类用类来实现继承的语言,在JavaScript中同国原型链的概念来实现。
说道原型链那我们就不得不谈谈: prototype() _proto_
prototype(任意一个构造函数都包含此属性,实现原型链的基础。指向该函数的原型对象)
例如:
function SuperType(){
this.proper= true;
}
SuperType.prototype//
superType在创建是便生成一个superType.prototype的原型对象,并且此对象中的constructor指向构造函数的本身.
_proto_(任意一个构造函数实例化的对象都包含此属性,指向构造函数的原型对象)
此时我们:var instance=new SuperType();
1)instance._proto_ === SuperType.prototype//返回的是true
2)SuperType.__proto__ === SuperType.prototype//返回的是false
搞清楚_proto_和prototype的区别上面的栗子就不难理解了。
_proto_指向构造函数的原型对象
prototype指向该函数的原型对象
instance的构造函数是SuperType 因此在第一个栗子中返回的值为true
SuperType的构造函数是Function 因此第二个栗子中返回的值是false
对于原型中的prototype 和_proto_相信大家都已经可以理解了。
那么原型链到底是如何构成的呢?
在我们SuperType这个构造函数中,我们让SuperType的实例等于一个函数A的原型对象。
函数A的原型对象将包好指向函数SuperType原型对象的指针,及可以拥有函数SuperType原型对象的属性。
我们以此类推就构成了实例与原型的链条。即我们所说的原型链。
对于原型链实现的具体过程我们下节继续分析。
第三节 原型的Protype和_proto
上节中我们介绍了原型中的Protype 和 _proto_的属性,这是构成原型链的基本属性。本节我们就来了解下原型链的形成过程。每个构造函数都有一个原型对象,原型对象都有一个包含指向构造函数的指针,而每个构造函数的实例都包含一个指向原型对象内部的指针。如果我们让原型对象等于另一个构造函数的实例,那此时原型对象将包含指向另一个原型的实例,以此层层递进,就构成了实例与原型的链条。下面以一个例子说明:
构建一个超类函数:function SuperType(){ this.proterty=true};
在超类函数的原型上创建方法:SuperType.prototype.getSuperValue=function(){return this.proterty}
创建一个子类函数:function SubType(){ thi.subProterty=false};
在子类函数的原型上创建方法:SuperType.prototype.getSuperValue=function(){return thi.subProterty}
实现子类继承超类: SubType.prototype = new SuperType();//重写了子类的原型,将子类原型替换成超类的实例,此时子类的原型指向超类的原型。
创建一个子类对象的实例:var instance=new SuperType()
用子类实例来访问超类函数的对象:instance.getSuperValue()//访问成功,返回true。
以上是原型链形成的过程, 简单说来就是子类函数SubType的原型没有使用SubType.prototype,而是将SuperType的实例作为其原型,于是此时SubType的原型不仅拥有SuperType的全部属性和方法,而且其内部还有一个指针,指向了SuperType的原型。因此此时SubType的实例instance便拥有了指向SuperType的原型。
说到这里相信大家对JavaScript中的原型链已经有所了解了。如果文章中所述有误,也请各位同道批评指正。