JS原型对象通俗"唱法"


Posted in Javascript onDecember 27, 2012

1.关于原型对象的重要知识点

首先要知道一个很重要的知识点,一句话:所有对象都有原型对象.

2. 对比其他语言的理解

原型对象,就是其它语言中的类中的静态属性和静态方法,总是是静态-static就对了.原理是: 内存中只有一份.

3. 在内存中的形象图:

首先,在产生js对象之前,我们需要创造一个构造函数(这都不知道,那就不要往下看了),如下:

function Person(name_, age_) { 
this.name = name_; 
this.age = age_; 
}

下面,我们就要new 对象了,这里,我们new三个(Person)对象,"张三" "李雷" "韩梅梅",他们来自同一个构造函数Person:

JS原型对象通俗"唱法"

内存中就这样了,每个对象,都有自己的 name, age 内存.这里new了多少个对象,就要开辟多少块name, age内存.

看到这,应该还是比较好理解的. 下面我们添加一条属性.location属性,如下:

function Person(name_, age_) { 
this.name = name_; 
this.age = age_; 
this.location = "地球"; 
}

这时候 我们在new这三个人. 内存情况如下:

JS原型对象通俗"唱法"

这里我们看,三个对象都有一个"地球"的内存空间.  这里你要动动大脑了, 三个人都有地球的内存,我们是不是可以这样呢?

JS原型对象通俗"唱法"

你看这样好不好呢? 这样只需要一个地球,大家都可以用了. 看到这,好吧,公用的那个空间如果是个对象的话,就是所谓的原型对象了.饿?就这样?

是的,就这样.

原型对象,最重要的作用就是把常量和方法独立到自身里. 供给其它 "自己的对象" 使用. 最后如图:

JS原型对象通俗"唱法"

4. 从代码的层次上介绍原型对象.

上图是内存中的对象,我们现在从代码的从面操作.

function Person(name_, age_) { 
this.name = name_; 
this.age = age_; 
this.location = "地球"; 
} 
// 三个具体的对象 
var zhangsan = new Person("zhangsan", 21); 
var lilei = new Person("lilei", 21); 
var hanmeimei = new Person("hanmeimei", 21); 
// 他们的原型对象是 
Person.prototype.location = "地球"; 
Person.prototype.killPerson = function() { 
return "杀人"; 
};

这里有一个问题,我们知道原型对象,可是我们怎么访问到原型对象里的属性呢. 就是我们如何获取到location ,和用 killPerson方法呢?
请看:
alert(zhangsan.location); 
alert(zhangsan.killPerson());

这样就可以访问到了,不过前提是,你的对象属性里面,没有定义location和killPerson.不然会把原对象的覆盖掉. 这里面涉及到原型问题即,
在zhangsan.location的时候,首先,我们检查zhangsan对象本身,从图中我们知道,张三有 name, age 和prototype指针属性. 并没有location,找不到以后,它会继续搜索原对象里面,看能否找到location属性,如果有,就会调用原对象的属性.
所以
alert(zhangsan.location) 会输出 "地球" 
alert(zhangsan.killPerson() ) 会输出 "杀人"

以上是我个人对原型对象的理解,希望对大家有帮助.
Javascript 相关文章推荐
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
Sep 27 Javascript
JQery jstree 大数据量问题解决方法
Mar 09 Javascript
JS 类型转换常见方法小结
May 31 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
Mar 24 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
Jun 26 Javascript
jQuery图片缩放插件smartZoom使用实例详解
Aug 25 jQuery
AngularJS动态添加数据并删除的实例
Feb 27 Javascript
通过封装scroll.js 获取滚动条的值
Jul 13 Javascript
在vue项目中优雅的使用SVG的方法实例详解
Dec 03 Javascript
Echarts实现多条折线可拖拽效果
Dec 19 Javascript
如何编写一个 Webpack Loader的实现
Oct 18 Javascript
Javascript执行上下文顺序的深入讲解
Nov 04 Javascript
通过jQuery源码学习javascript(二)
Dec 27 #Javascript
js 判断一个元素是否在页面中存在
Dec 27 #Javascript
通过jQuery源码学习javascript(一)
Dec 27 #Javascript
Eval and new funciton not the same thing
Dec 27 #Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
Dec 27 #Javascript
JS 添加网页桌面快捷方式的代码详细整理
Dec 27 #Javascript
JavaScript初学者应注意的七个细节详细介绍
Dec 27 #Javascript
You might like
PHP 采集心得技巧
2009/05/15 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
javascript实现别踩白块儿小游戏程序
2015/11/22 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
js实现tab切换效果
2017/02/16 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
浅谈Express异步进化史
2017/09/09 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
初试vue-cli使用HBuilderx打包app的坑
2019/07/17 Javascript
vue实现打地鼠小游戏
2020/08/21 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
python 域名分析工具实现代码
2009/07/15 Python
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
Python实现将json文件中向量写入Excel的方法
2018/03/26 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
Pytorch GPU显存充足却显示out of memory的解决方式
2020/01/13 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
Java基础面试题
2014/07/19 面试题
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
就业自荐信
2013/12/04 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
儿媳婚宴答谢词
2014/01/14 职场文书
室内趣味活动方案
2014/08/24 职场文书
教师三严三实对照检查材料
2014/09/25 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
匿名信格式范文
2015/05/27 职场文书
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js