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 相关文章推荐
javascript基础第一章 JavaScript与用户端
Jul 22 Javascript
javascript中怎么做对象的类型判断
Nov 11 Javascript
node.js入门教程
Jun 01 Javascript
解决jquery版本冲突的有效方法
Sep 02 Javascript
Angular2从搭建环境到开发步骤详解
Oct 17 Javascript
jQuery绑定事件的四种方式介绍
Oct 31 Javascript
jQ处理xml文件和xml字符串的方法(详解)
Nov 22 Javascript
Vue框架中正确引入JS库的方法介绍
Jul 30 Javascript
JS实现中英文混合文字溢出友好截取功能
Aug 06 Javascript
微信小程序HTTP接口请求封装代码实例
Sep 05 Javascript
vue大型项目之分模块运行/打包的实现
Sep 21 Javascript
jQuery实现增删改查
Dec 22 jQuery
通过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 header()函数语法及使用代码
2013/11/04 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
深入理解PHP内核(一)
2015/11/10 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
10个实用的脚本代码工具
2010/05/04 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
2014/08/11 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
关于JSON与JSONP简单总结
2016/08/16 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
JavaScript计算出两个数的差值
2020/03/19 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
python tkinter窗口最大化的实现
2019/07/15 Python
python selenium实现发送带附件的邮件代码实例
2019/12/10 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
HTML5文档结构标签
2017/04/21 HTML / CSS
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
庆元旦广播稿
2014/02/10 职场文书
2014法制宣传日活动总结
2014/07/09 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
教师节老师寄语
2015/05/28 职场文书
Javascript中的解构赋值语法详解
2021/04/02 Javascript
压缩Redis里的字符串大对象操作
2021/06/23 Redis