JS原型和原型链以及闭包(转)
原型:
原型?第一次听到这个东西,完全不知道是个啥…到处查书啊,到处网上搜呀,可惜也没搞懂。后来读了泽卡斯的书才慢慢体会到这个东西,读了好几遍有木 有!以前我一直以为原型对象是个附加条件,是个莫名其妙不知道怎么来的东西。不过据我现在也不算全面的了解,其实原型确实是js面向对象的精髓所在,虽然 它不像java之类的传统面向对象语言的样子,但是它也是一种独特的方式。
在我的理解看来,之所以称为原型对象,那么必然是每个对象都有一个原型对象,而且原型对象也是个对象,它和其他对象根本没有任何区别,只不过每次你 new一个对象出来,都会有个附加的原型对象,那么js为什么要有个原型对象呢?这就要追溯到js的面向对象了,你实例化很多对象以后,原型的作用就出来 了,原型对象就像是泥巴,对应的对象就是就是泥人,每个泥人可以不同,但是泥巴的本质都是一样的,这也就是JS的面向对象吧。
我认为对象的有三个”种”:1.构造函数;2.实例;3.原型对象;
这”三个对象”当然是有着联系的:1.实例中保存着指向原型对象的指针;2.原型对象中有指向构造函数的指针;(实例和构造函数没有什么指针之类的关系)
关于实例指向原型对象的指针,我想这也是继承和原型链的本质(Zakas同学也在书中这么说道——他是Yahoo!首席前端开发工程师,我觉得他应该是这个星球上前端最厉害的了吧。。。)
原型链:
原型链?原型链就是把原型连接在一起组成的链,那么为什么要把原型连接在一起呢?这就是继承啦,当你new一个对象,然后把另一个对象赋值给他的原型对象,like:
-
function Person(){};
-
function Niko(){};
-
Niko.prototype = new Person();
这样,Niko就具有了Person的所有属性和方法,这也是为什么每个对象都有Object对象方法和属性的原因,因为所有对象都从Object对象继承而来。
闭包:
闭包?闭包其实就是作用链域的问题(如果你还没听过闭包,建议你去google或者baidu一下),作用链域是个麻烦而有趣的东西,至少我这么觉得。
闭包的产生是因为闭包函数包含了外围函数的作用域(引用看待),说道作用链域,要花一大篇幅来说,今天就先不说了,直接说有关闭包的就好了。
闭包是个强大的东西,因为它包含了外围函数的作用域,这样来看的话,它可以实现非常多的功能,但是它也有个坏处,既然能包含外围函数的作用域,这样看来就会产生性能问题,而且在搜索变量时遍历作用链的时候也会有额外的开销。