JavaScript中原型学习基础

第一节 原型基础

转眼之间接触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//

  1.  Object {constructorfunction}
    1. constructor:function superType()
    2. __proto__:Object

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中的原型链已经有所了解了。如果文章中所述有误,也请各位同道批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值