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 相关文章推荐
JQuery 技巧和窍门整理(8个)
Apr 22 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
Oct 29 Javascript
浅析如何利用angular结合translate为项目实现国际化
Dec 08 Javascript
JavaScript解析JSON格式数据的方法示例
Jan 24 Javascript
深入理解Javascript箭头函数中的this
Feb 13 Javascript
JS获取字符对应的ASCII码实例
Sep 10 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
Nov 25 Javascript
详解js中let与var声明变量的区别
Apr 05 Javascript
JavaScript Date对象功能与用法学习记录
Apr 28 Javascript
vue el-tree 默认展开第一个节点的实现代码
May 15 Javascript
Element Popover 弹出框的使用示例
Jul 26 Javascript
JavaScript 判断数据类型的4种方法
Sep 11 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解析http获取的json字符串变量总是空白null
2015/03/02 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
2016/12/21 PHP
IOS 开发之NSDictionary转换成JSON字符串
2017/08/14 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
javascript 表单的友好用户体现
2009/01/07 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
2017/09/22 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
微信小程序左滑删除实现代码实例
2019/09/16 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
2020/09/02 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
python实现文件快照加密保护的方法
2015/06/30 Python
Python 存储字符串时节省空间的方法
2019/04/23 Python
深入了解Django View(视图系统)
2019/07/23 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
Java工程师面试集锦之Spring框架
2013/06/16 面试题
材料员岗位职责
2014/03/13 职场文书
班级文化建设标语
2014/06/23 职场文书
竞选大队干部演讲稿
2014/09/11 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
小学数学教师研修日志
2015/11/13 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
财产分割协议书
2016/03/22 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android
一篇文章带你复习java知识点
2021/06/28 Java/Android
使用Nginx+Tomcat实现负载均衡的全过程
2022/05/30 Servers
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers