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 相关文章推荐
Jquery 实现Tab效果 思路是js思路
Mar 02 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
Jan 23 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
Jun 17 Javascript
js 三级关联菜单效果实例
Aug 13 Javascript
node.js中的dns.getServers方法使用说明
Dec 08 Javascript
JavaScript调用客户端Java程序的方法
Jul 27 Javascript
JQuery悬停控制图片轮播——代码简单
Aug 05 Javascript
Jquery使用小技巧汇总
Dec 29 Javascript
React实现双向绑定示例代码
Sep 19 Javascript
为你的微信小程序体积瘦身详解
May 20 Javascript
用vue封装插件并发布到npm的方法步骤
Oct 18 Javascript
实现elementUI表单的全局验证的方法步骤
Apr 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
农民C键的运用技巧
2020/03/04 星际争霸
跟我学小偷程序之成功偷取首页(第三天)
2006/10/09 PHP
新版PHP极大的增强功能和性能
2006/10/09 PHP
php面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
PHP中的float类型使用说明
2010/07/27 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
PHP基于PDO扩展操作mysql数据库示例
2018/12/24 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
构造函数+原型模式构造js自定义对象(最通用)
2014/05/12 Javascript
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
python版本五子棋的实现代码
2018/12/11 Python
python实现支付宝转账接口
2019/05/07 Python
Python读写文件模式和文件对象方法实例详解
2019/09/17 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
Django model.py表单设置默认值允许为空的操作
2020/05/19 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
植村秀美国官网:Shu Uemura美国
2019/03/19 全球购物
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
长曲棍球装备:Lacrosse Monkey
2020/12/02 全球购物
2014年师德师风自我剖析材料
2014/09/27 职场文书
学习党章心得体会2016
2016/01/15 职场文书
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android