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中hasOwnProperty()的作用
Jun 05 Javascript
javascript full screen 全屏显示页面元素的方法
Sep 27 Javascript
用javascript删除当前行,添加行(示例代码)
Nov 25 Javascript
chrome下img加载对height()的影响示例探讨
May 26 Javascript
如何用angularjs制作一个完整的表格
Jan 21 Javascript
jQuery简单获取键盘事件的方法
Jan 22 Javascript
jQuery插件开发精品教程让你的jQuery提升一个台阶
Jan 27 Javascript
js实现可键盘控制的简单抽奖程序
Jul 13 Javascript
Vuejs第十篇之vuejs父子组件通信
Sep 06 Javascript
Angular浏览器插件Batarang介绍及使用
Feb 07 Javascript
微信小程序websocket实现即时聊天功能
May 21 Javascript
详解React路由传参方法汇总记录
Nov 29 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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
jquery中常用的SET和GET
2009/01/13 Javascript
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
两个Javascript小tip资料
2010/11/23 Javascript
jquery 学习之二 属性(类)
2010/11/25 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
学习JavaScript设计模式之责任链模式
2016/01/18 Javascript
JS中多种方式创建对象详解
2016/03/22 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
2016/07/09 Javascript
js return返回多个值,通过对象的属性访问方法
2017/02/21 Javascript
vue+node+webpack环境搭建教程
2017/11/05 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
深入解析Python中的WSGI接口
2015/05/11 Python
Python内置模块logging用法实例分析
2018/02/12 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
求职简历中的自我评价分享
2013/12/08 职场文书
安全承诺书格式
2014/05/21 职场文书
小学校本培训方案
2014/06/06 职场文书
暑期政治学习心得体会
2014/09/02 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
新郎结婚感言
2015/07/31 职场文书
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL