javascript prototype,executing,context,closure_prototype

要学好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的实例。

时间: 2024-10-23 19:55:54

javascript prototype,executing,context,closure_prototype的相关文章

JavaScript中错误正确处理方式,你用对了吗?

JavaScript的事件驱动范式增添了丰富的语言,也是让使用JavaScript编程变得更加多样化.如果将浏览器设想为JavaScript的事件驱动工具,那么当错误发生时,某个事件就会被抛出.理论上可以认为这些发生的错误只是JavaScript中的简单事件. 本文将会讨论客户端JavaScript中的错误处理.主要介绍JavaScript中的易犯错误.错误处理.异步代码编写等内容. 下面就让我们一起看看如何正确处理JavaScript中的错误. Demo演示 本文中使用的demo可以在GitH

javascript实现checkBox的全选,反选与赋值

 这篇文章主要介绍了javascript实现checkBox的全选,反选与赋值的方法,以实例形式详细分析了实现的思路及对应的html与js代码的实现过程     我们平时在做项目的时候,经常会遇到需要实现实现checkBox的全选,反选与赋值的情况,网上也有许多的范例,这里给大家分享的是本人常用的方法,推荐给大家.   代码如下: //js 数值是否在数组中 Array.prototype.in_array = function(e){ for(i=0;i<this.length;i++){ i

注解-@Query 事务问题,Executing an update/delete query

问题描述 @Query 事务问题,Executing an update/delete query 新搭建了一个 Spring MVC+Spring Data JPA+Hibernate的一个工程 在DAO的方法之上加了注解@Query.@Modifying,但是在运行过程中一直抛出 javax.persistence.TransactionRequiredException: Executing an update/delete query 的异常,实在无力了,希望有大大来帮助 2015-04

javascript 多次 new function 函数,返回的对象里面的属性值为何相同?

问题描述 javascript 多次 new function 函数,返回的对象里面的属性值为何相同? 分别在两秒和四秒后,把new 出来的对象输送到 控制台,但是结果都是一样的,对这块有点不是太明白?这个与面向对象的new 差异性在哪? 解决方案 你的prototype DEFAULT属性是对象,extend后直接修改对象,会导致另外所有实例继承的DEFAULT属性被修改了 生成一个副本,而不是直接修改原型中的对象 this.DEFAULT = $.extend({}, this.DEFAUL

javascript实现表单提交后,提交按钮不可用的方法

 具体如下: 这里使用javascript控制表单提交后,提交按钮不可用,可以防止用户多次提交. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>表单提交后按钮禁用</title> <

javascript 调用: html中使用javascript调用本地程序(exe,doc等)

第一次用到这个,做个记录,在html页面中调用本地程序:<html><head><script language="javascript">function Run(strPath){var objShell = new ActiveXObject("wscript.shell");objShell.exec(strPath);objShell = null;}</script></head><bod

JavaScript的类型转换(字符转数字,数字转字符)

javascript|转换 在Java中,基本类型之间的强制转换也不是这样的,比如,整数要转换成字符串,必须使用Integer.toString()静态方法或者String.valueOf()静态方法,把字符串转换为整数,必须使用Integer.valueOf().可见,不能把JavaScript中的类型转换看作为"强制类型转换".在JavaScript中,Double类型和Int类型都是看作为Number对象,因此无论是typeof 1还是typeof 1.0,都是返回number.

使用javascript将时间转换成今天,昨天,前天等格式

  这篇文章主要介绍了使用javascript将时间转换成今天,昨天,前天等格式的相关资料,需要的朋友可以参考下 方法超级简单,把时间格式化一下就好了,直接奉上代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 function transDate() { var $time =document.getElementById("share-time"); var date = $tim

JavaScript 各种遍历方式详解,有你不知道的黑科技

为了方便例子讲解,现有数组和json对象如下 var demoArr = ['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular']; var demoObj = { aaa: 'Javascript', bbb: 'Gulp', ccc: 'CSS3', ddd: 'Grunt', eee: 'jQuery', fff: 'angular' }; for 可以直接看示例,用得太多了,很简单 (function() { for(var