搜索
写经验 领红包

javascipt原型原型链有什么特点(javascipt原型和原型链特点)

导语:JavaScript原型及原型链

在上一讲当中我们知道了new 一个函数时this的指向,接下来我们就分析一下这里的原型类和原型链。

原型类

定义:原型类是function函数下的一个属性,它定义类构造函数构造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。

person1与person2同时拥有name和age属性,我们如下图分析:

Person构造函数的prototype属性指向了Person.prototype原型类对象,所以可以说Person.prototype原型类是构造函数Person的一个属性

需要重点说明一下:一个原型对象,其中的方法、属性,平时它的构造器是无法访问到原型里面的方法、属性的,但当执行new后,它构造出的实例对象便可以访问原型里面的方法、属性。虽然可以访问里面的属性、方法,但不能直接修改原型类里面的值,故:person1.name=‘sunxiaoqiang’ => 这不是在修改原型类中的name属性,而是在给person1增加一个name属性;如果一定要修改原型类里面的值(感觉没有必要)通过上图我们可以这样:person1.constructor.prototype.name=’sunxiaoqiang’

依次输出:

sunqiang

Sundaqiang

介绍到这里,我们应该明白,可以利用原型类提取一些公共属性,以便于每个实例都拥有这些属性。

为了深刻了解原型类,我们分析一个例子:

此时person的name属性还是sunqiang,分析:

当new一个Person函数返回this时,this里面有一个属性_proto_内部属性,其值指向Person.prototype

我们可以这样理解:按执行顺序走,当new Person函数时,this中的_proto_指向Person.Prototype,而这个Person.Prototype指向一个对象,此对象里有一个name属性。当我们重新给Person.Prototype重新赋值时,会不会影响this的_proto_指向,答案是不会的,我们如下图分析:

我们不难发现,this属性_proto_的指向不变。

原型类我们有了一些概念了,接下来看看由原型构建出来的原型链。

原型链

画图分析一下:

将SubClass的prototype指向SuperClass的实例对象,new SuperClass函数发生的什么上面已经介绍,通过图我们发生SubClass、SuperClass、SuperClass prototype和Object它们之间形成了一个链子,这就构成了原型链。在这里也形成了简单的原型链继承,我们发现它们最终都继承自Object.prototype=>Object。

当查询一个属性或方法时,首先在子类自身找,如果没有在向父类找,一层一层查询;删除也是一样,子类有的属性或方法就会删除,不影响父类级别的。

可以这么说任何对象都会有toString()方法,不管对象自身有没有这个方法,它们都继承自Object.prototype方法。

当我们写一个空对象({}),然后调用toString()方法,返回的是一个”[object Object]”,那为什么我们给num变量赋值一个数字123,然后调用num.toString()方法返回是一个字符串”123”呢?

原因就是num是Number类型,它属于包装类,此类重写类toString()方法,因为继承所以在访问这个方法时优先找自身的。

像Array.prototype、Array.prototype、Boolean.prototype、String.prototype都重写的父类的toString()方法。

基于上面的知识点,我们可以为自己使用的对象进行扩展。

当我们需要知道数据类型时,比如:Number、Boolean、Array、String这些类型时,那我们还是需要调用Object.prototype方法,因为这个方法会依次显示”[object Number]”,”[object Boolean]”,”[object Array]”,”[object String]”进而区分数据类型,应该如何调用呢,后续我再讲call时会提到,敬请关注

本文内容由小茜整理编辑!