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 相关文章推荐
精选的10款用于构建良好易用性网站的jQuery插件
Jan 23 Javascript
基于Jquery实现键盘按键监听
May 11 Javascript
jQuery事件用法实例汇总
Aug 29 Javascript
JS来动态的修改url实现对url的增删查改
Sep 05 Javascript
javascript html实现网页版日历代码
Mar 08 Javascript
jQuery Mobile页面返回不需要重新get
Apr 26 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
Jul 07 Javascript
javascript字体颜色控件的开发 JS实现字体控制
Nov 27 Javascript
怎样在vue项目下添加ESLint的方法
May 16 Javascript
JavaScript工具库MyTools详解
Jan 01 Javascript
javascript实现一款好看的秒表计时器
Sep 05 Javascript
React Hook用法示例详解(6个常见hook)
Apr 28 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中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
PHP进程通信基础之信号
2017/02/19 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
ECMAScript6函数默认参数
2015/06/12 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
jQuery中内容过滤器简单用法示例
2018/03/31 jQuery
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
vue生命周期的探索
2019/04/03 Javascript
node.js +mongdb实现登录功能
2020/06/18 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
Python struct模块解析
2014/06/12 Python
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
Python中Selenium模拟JQuery滑动解锁实例
2017/07/26 Python
Python自定义线程池实现方法分析
2018/02/07 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
对Python 数组的切片操作详解
2018/07/02 Python
岗位职责的含义
2013/11/17 职场文书
小松树教学反思
2014/02/11 职场文书
乡镇网格化管理实施方案
2014/03/23 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
留学生求职信
2014/06/03 职场文书
幼儿园门卫岗位职责范本
2014/07/02 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
小学感恩节活动策划方案
2014/10/06 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
员工手册董事长致辞
2015/07/29 职场文书
mysql数据库如何转移到oracle
2022/12/24 MySQL