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
好吧,接下来就是概念的东西了。
在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那里继承过来的几个方法,并不常用就不多赘述了,有兴趣的自行查阅。
原型的具体运用会在后面说到。
- JS面向对象之原型
- js面向对象之继承-原型继承
- js面向对象-原型
- JS 面向对象 原型
- js面向对象与原型
- js--面向对象--原型链
- 高级面向对象 之 js是基于原型的程序
- 【面向JS--面向对象和原型】
- js面向对象-动态原型方法
- js中的面向对象和原型
- js面向对象-动态原型方法
- js prototype原型面向对象编程详解
- 【JS学习笔记】 面向对象与原型
- js基于原型的面向对象
- JS面向对象-原型链的认知
- js面向对象原型和继承
- js面向对象及函数原型
- js之面向对象
- 关于DIV
- HDU4118:Holiday's Accommodation(思维 & dfs)
- 《数据库SQL实战》查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t
- VPP启动
- 各种三角形的制作
- JS面向对象之原型
- String 类提供的常用方法20170728
- 玲珑杯”ACM比赛 Round #19 A simple math problem
- kmp模板
- 对java 内存可见性的理解
- 题目学习——HDUOJ-1492
- 什么是GTK
- flex布局
- python异常处理