javascript快速学习二:实现继承的特殊实现方法prototypal (原型)

      在Javascript中理解原型的工作原理是非常重要的,因为对于javascript来说它的对象模型完全是基于原型的。当然javascript这种不走寻常路的脾性,还是源于出生的惨痛经历,生父并不爱他 。

      原型对象是什么,能吃吗?

“我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。”

      --摘自人民邮电出版社出版的Nicholas C.Zakas著的《JavaScript高级程序设计》

      好吧,又是一段有中国特色的概念讲解,每当对某个概念不清楚时,百度出来的结果往往令我更加的模糊,一般遇到这样的情况我就会直接看代码,看看它究竟能帮助我们做些什么。

      最开始写javascript的时候我是这样写:

var provience=‘beijing‘,city=‘beijing‘;

function add(x,y){
return x+y;
}

function subtract(x,y){
return x-y;
}

      通过一个个function来得到想要的结果。

使用原型

      为了更优雅友好的实现代码我们引入了Prototype。

      定义了一个我们常见的构造方法:

var Calculator=function(x,y){
this.x=x;
this.y=y;
};

      为此对象通过原型赋予相关的getInfo方法:

Calculator.prototype.getInfo=function(){
return ‘x:‘+this.x+‘,y:‘+this.y;
}

     执行:

var test=new Calculator(1,3);
test.getInfo();

>x:1,y:3

      于是我们可以理解原型为:

在函数被定义时对象的属性中就包含了原型,并且原型可以管理特定对象的属性及方法,放在构造函数中。

原型链

           “原型链”的作用在于当读取某个属性时,javascript会遍历查找自身属性,如果不存在则会去prototype中进行查找,如果在找不到就回返回“undefined”,从上面我们知道了,通过原型我们可以有效的修改及管理指向的对象,同时我们通过原型修改该对象指向哪一个对象。同时也就实现了一种简单的继承。

         propotype对象有一个constructor属性,默认指向Prototype对象所在的构造函数,因为定义在Prototype对象上,意味着可以被所有实例继承。

vara = new Array();

a.hasOwnProperty(‘constructor‘)

// false

a.constructor === Array.prototype.constructor

// true

      上面代码表示a是构造函数Array的实例对象,但是a自身没有contructor属性,该属性其实是读取原型链上面的Array.prototype.constructor属性。

constructor属性的作用是分辨prototype对象到底定义在哪个构造函数上面。

function Foo(){}

Foo.prototype.constructor===Foo

// true

RegExp.prototype.constructor===RegExp

// true

      上面代码的Foo和RegExp都是构造函数,它们的prototype.constructor属性默认指回Foo和RegExp。

       其实针对于JavaScript原型的文章有很多,总之理解好原型,对我们日后更好的理解使用JavaScript相关面向对象概念及类似于commandjs等标准规范的理解也很重要。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。