JS面向对象之原型

来源:互联网 发布:妙笔生花软件安卓 编辑:程序博客网 时间:2024/05/16 08:49

    在其他很多语言里,都是利用类来实现继承的。但是在 javascript 这个脚本语言里为了简单方便学习,设计者并不打算设计类这个概念,于是乎为了把所有的对象关联起来设计出了原型这个独一无二的东西。

具体故事及原型理解可参考:http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html

        (这是什么狗屁缩进啊???啊啊啊啊啊啊!!!)

这里写点自己的理解以及书上的东西。

-----------------------------------------------------------------------------------------

先不急着说明原型是什么,看看下面这段代码来说一下我们为什么要使用原型。


function dog(name){this.name = name;this.shut = function(){alert("im  "+this.name);}}var dog1 = new dog("fugui");var dog2 = new dog("laifu");console.log(dog1.shut == dog2.shut);//false


是的通过这种方法你会发现dog1和dog2两个实例的方法居然是不相等的!这说明这两个方法是不同的两个方法,占用了不同的内存空间。这会造成什么问题呢?------ 没错,就是内存的浪费,我们希望通过某种方法能让dog1 和dog2能够共享shut这个方法。于是乎原型呼之欲出-----------------------------------------


好吧,接下来就是概念的东西了。

在javascript中,每当你构建一个函数,就会为这个函数创建一个属性prototype。这个属性正好指向了这个函数的。。。。。。。。。。。。。什么????


没错!那就是原型。比如dog.prototype 这样我们就能访问你写的这个函数的原型了!


(所以讲了半天你还是没说原型是什么??)


诶别急嘛,让我喝口水。


如果你不在这个dog函数里写shut方法,而是跑到原型这个对象里(原型也是一个对象)写这个shut方法的话,那么所有的dog1,dog2,,,,,,,dog10000 他们就都能共享这个shut啦 。


也就是说你写 


function dog(name){this.name = name;}dog.prototype.shut = function(){alert("im  "+this.name);}var dog1 = new dog("fugui");var dog2 = new dog("laifu");console.log(dog1.shut == dog2.shut);//true


如此这般你会发现,,,,是不是真特么简单啊。 也就是说只要你定义属性或者方法的时候跑到这个dog.prototype里面去定义就能让所有的实例(dog1,dog2,,,,,dogXX)都能共享这些属性或者方法了。

比如我可以写


function dog(name){this.name = name;}dog.prototype.age = 21;var dog1 = new dog("fugui");var dog2 = new dog("laifu");console.log(dog1.age);//21console.log(dog2.age);//21


看见没看见没!!!这样每个实例都能共享这些属性和方法了。


(喂!你都不讲为什么的吗??)


咳咳,,,, 

那是因为每当你创建一个实例的时候,比如dog1,dog1内部就会有一个指针,这个指针叫做[[prototype]] (注意这里是有括号的),他会指向dog.prototype 。也就是说dog1能够访问到dog.prototype 。且看我灵魂画手





是不是很清晰明了??哈哈哈啊


注意这里dog.prototype里面有一个constructor属性,这个属性里也有一个指针,它恰好指向了dog。 还有dog.prototype一开始其实并不是什么都没有的,还有他从object那里继承过来的几个方法,并不常用就不多赘述了,有兴趣的自行查阅。

原型的具体运用会在后面说到。

原创粉丝点击