javascript prototype,executing,context,closure


Posted in Javascript onDecember 24, 2008

要学好JavaScript,有几个基本概念必须搞清楚:prototype,executing,context,closure。
Prototype

在JavaScript语言中,通常使用Prototype来实现OO。在这里,我们不对JavaScript的OO实现进行过多的探讨,着重来看一下JS中对象的内存模型。在开始之前,需要先明确以下几点:
1. JS中,存在以下几种数据类型:string,number,boolean,object,function(注意:首字母均为小写)。
2 “Object”, “String”, “Date”等内置数据类型,在JS中实际上是函数名称(使用"alert(typeof Object)"可以验证,输出为"function")。我们通常指的类型为"Date"的数据类型,实际上是通过"new Date"所产生的对象。
3. 在JavaScript中,对象都是associative array (hash table),可以动态指定对象的property。
4. 在Firefox中可以使用"__proto__"属性来查看一个对象的"prototype"。

下面我们来看一个简单的例子:

function Person() { this.age = 10; this.name = "test";}Person.prototype = new Object;var p = new Person;alert(p); // output "[object Object]"alert(p.__proto__); // output "[object Object]"

可以看出Person数据类型具有一个“prototype”,如果更改这个prototype,会影响到所有已经产生的Person类型的对象,同时也会影响到以后建立的Person类型的对象。如果指定一个function的prototype属性,则所有使用该function生成的对象实例中(使用new操作符)都具有该prototype,在Firefox 中,可以使用"__proto__"属性访问。

通常情况下,我们讲JS中的对象都继承Object数据类型,这是如何体现的呢?我们把以上的程序稍微修改一下:

function Person() { this.age = 10; this.name = "test";}var p = new Person;alert(p); // output "[object Object]"alert(p.__proto__); // output "[object Object]"alert(p.__proto__.__proto__); // output "[object Object]"alert(p.__proto__.__proto__ == Object.prototype); // output "true"alert(p.__proto__.__proto__.__proto__); // output "null"

由以上程序可以看到,Person的"prototype"(在这里,没有明确指定Person.prototype, 而是使用缺省值)的"prototype" (p.__proto__.__proto__)正是Object.prototype, Object.prototype是prototype chain的终点(其自己的祖先为null)。

在JS中,Object是function,同时,所有function的实例,也都是Object。请看如下程序:

/* Object, Function都是function数据类型 */alert(typeof Object); // output "function"alert(typeof Function); // output "function"/* Function的prototype是一个空function */alert(Function.prototype); // output "function() {}"alert(Function.__proto__ == Function.prototype); // output "true"/* function是object, 其prototype chain的终点是Object.prototype */alert(Function.__proto__.__proto__ == Object.prototype); //output "true"/* Object是function的实例 */ alert(Object.__proto__ == Function.prototype); // output "true"alert(Object.__proto__.__proto__ == Object.prototype); // output "true"改变Function.prototype会影响到“Object”,改变Object.prototype会影响到所有function的实例。

Javascript 相关文章推荐
javascript parseInt与Number函数的区别
Jan 21 Javascript
jQuery 入门级学习笔记及源码
Jan 22 Javascript
javascript 得到变量类型的函数
May 19 Javascript
JavaScript注入漏洞的原理及防范(详解)
Dec 04 Javascript
JS实现的五级联动菜单效果完整实例
Feb 23 Javascript
React-Native使用Mobx实现购物车功能
Sep 14 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
Aug 27 Javascript
postman自定义函数实现 时间函数的思路详解
Apr 17 Javascript
微信小程序Page中data数据操作和函数调用方法
May 08 Javascript
vue 实现websocket发送消息并实时接收消息
Dec 09 Javascript
vue分页插件的使用方法
Dec 25 Javascript
JS 4个超级实用的小技巧 提升开发效率
Oct 05 Javascript
JavaScript 事件参考手册
Dec 24 #Javascript
javascript XML数据显示为HTML一例
Dec 23 #Javascript
window.location和document.location的区别分析
Dec 23 #Javascript
javascript 硬盘序列号+其它硬件信息
Dec 23 #Javascript
js 解决“options为空或不是对象”
Dec 22 #Javascript
javascript 动态参数判空操作
Dec 22 #Javascript
Javascript 布尔型分析
Dec 22 #Javascript
You might like
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
jquery实现心算练习代码
2010/12/06 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
让nodeJS支持ES6的词法----babel的安装和使用方法
2017/07/31 NodeJs
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
[52:37]完美世界DOTA2联赛循环赛 Forest vs DM BO2第一场 10.29
2020/10/29 DOTA
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
Python用GET方法上传文件
2015/03/10 Python
python对url格式解析的方法
2015/05/13 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
jupyter修改文件名方式(TensorFlow)
2020/04/21 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
2020/06/01 Python
汽车专业毕业生自荐信
2013/11/03 职场文书
酒店个人求职信范文
2014/01/25 职场文书
优秀班干部事迹材料
2014/01/26 职场文书
上海世博会口号
2014/06/19 职场文书
离婚协议书标准格式
2014/10/04 职场文书
民事申诉状范本
2015/05/20 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
python实现进度条的多种实现
2021/04/29 Python
React Fragment介绍与使用详解
2021/11/11 Javascript