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 相关文章推荐
用循环或if语句从json中取数据示例
Aug 18 Javascript
jQuery中Ajax的get、post等方法详解
Jan 20 Javascript
RequireJS入门一之实现第一个例子
Sep 30 Javascript
jquery获取点击控件的绝对位置简单实例
Oct 13 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
Nov 22 Javascript
js仿百度音乐全选操作
Jan 13 Javascript
Vuejs中使用markdown服务器端渲染的示例
Nov 22 Javascript
vue 简单自动补全的输入框的示例
Mar 12 Javascript
Electron-vue开发的客户端支付收款工具的实现
May 24 Javascript
layui form.render('select', 'test2') 更新渲染的方法
Sep 27 Javascript
vue实现前端分页完整代码
Jun 17 Javascript
vue 自定义的组件绑定点击事件
Apr 21 Vue.js
通过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
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
javascript 一段左右两边随屏滚动的代码
2009/06/18 Javascript
层序遍历在ExtJs的TreePanel中的应用
2009/10/16 Javascript
基于JQuery实现CheckBox全选全不选
2011/06/27 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
JS验证字符串功能
2017/02/22 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
2017/08/04 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
Ant Design Pro 下实现文件下载的实现代码
2019/12/03 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
django框架两个使用模板实例
2019/12/11 Python
Python实现对adb命令封装
2020/03/06 Python
Pytorch高阶OP操作where,gather原理
2020/04/30 Python
python如何求圆的面积
2020/07/01 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
python实现定时发送邮件
2020/12/23 Python
AJAX都有哪些有点和缺点
2012/11/03 面试题
销售岗位职责范本
2014/06/12 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
纪念九一八事变演讲稿1000字
2014/09/14 职场文书
课堂打架检讨书200字
2014/11/21 职场文书