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 相关文章推荐
Js点击弹出下拉菜单效果实例
Aug 12 Javascript
页面装载js及性能分析方法介绍
Mar 21 Javascript
用于deeplink的js方法(判断手机是否安装app)
Apr 02 Javascript
confirm的用法示例用于按钮操作时确定是否执行
Jun 19 Javascript
javascript高级编程之函数表达式 递归和闭包函数
Nov 29 Javascript
Bootstrap的Refresh Icon也spin起来
Jul 13 Javascript
bootstrap select插件封装成Vue2.0组件
Apr 17 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
Jun 08 jQuery
ionic3实战教程之随机布局瀑布流的实现方法
Dec 28 Javascript
关于vue的npm run dev和npm run build的区别介绍
Jan 14 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
Jun 18 jQuery
layui 弹出层回调获取弹出层数据的例子
Sep 02 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
人族 Terran 基本策略
2020/03/14 星际争霸
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
php 模拟get_headers函数的代码示例
2013/04/27 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
JavaScript中的Location地址对象
2008/01/16 Javascript
JS面向对象编程 for Cookie
2010/09/19 Javascript
使用隐藏的new来创建对象
2011/03/29 Javascript
setTimeout和setInterval的区别你真的了解吗?
2011/03/31 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
Vue.js计算属性computed与watch(5)
2016/12/09 Javascript
详解react使用react-bootstrap当轮子造车
2017/08/15 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
Python中使用Inotify监控文件实例
2015/02/14 Python
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
python生成IP段的方法
2015/07/07 Python
python中copy()与deepcopy()的区别小结
2018/08/03 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
django ajax发送post请求的两种方法
2020/01/05 Python
CSS3媒体查询(Media Queries)介绍
2013/09/12 HTML / CSS
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
会计专业个人求职信范文
2014/01/08 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
mysql insert 存在即不插入语法说明
2022/03/25 MySQL