在js中,内建对象Object,Function等之间的关系

JavaScript014

在js中,内建对象Object,Function等之间的关系,第1张

一、从定义的角度来说:

function Function(){}

前者为定义一个js函数

后者为这个函数的名称

Object为选择的DOM对象

二、从用法讲:

var a = new Object(function(){})

这里a也是function了。

三、总结:

不管是function ,还是new Function(), 还是new Object(function(){}),当解释器(例如V8)遇到时,则将它们初始化成一个函数(最主要的是给其添加了一个[[call]]属性)。

javascript中,“函数”(方法)也是对象。

一切对象都有一个根源。它是Object.prototype。

根源之上再没有其他根源。Object.getPrototypeOf(Object.prototype)是null。js中除字面量以外的一切引用对象都来自这个“根源”对象。

表达式Object.getPrototypeOf(Function) === Function.prototype的结果是真。这是Function特有的。实际上Function的prototype是一个内置函数,一切函数都派生自这个内置函数,这个内置函数是一个函数工厂。这个内置函数对象的prototype指向“根源”对象。

表达式Object.prototype === Object.getPrototypeOf(Function.prototype)的结果是真。说明了Object跟Function二者之间的联系,是通过“根源”对象联系起来的。

Function和Object,既是函数,因为都可以Function()或者Object()这样的方式执行,又是对象,因为可以Function.a = 'a',Object.a = 'a'这样赋值。

说它们是函数,是因为他们都是通过上面第4条中说的”内置函数工厂“,派生出来的,因而具备函数的特性。

说他们是对象。是因为他们都是通过上面第1条中的”根源“对象,派生出来的,因此具备对象的特征。

继续说一下,Function.prototype指向”内置函数“。而Object.prototype指向”根源对象“。

因而new Function会产生一个匿名函数,而new Object产生一个plain object。

他们之间的关系简单描述就像下面这样。

分成几步走:

【第一步】

首先通过视频或者书籍,学习JS的基本语法、基本特性等,

同时了解JS都有哪些内置函数、内置属性等,

建立起对JS都能做什么,它用来做什么,它都能实现什么功能等基本的宏观概念;

【第二步】

给自己预定一个大概可以实现的JS功能,然后试图去完成它,不用非要做到全原创

通过抄袭代码放到你的网页上去,让它可以达到你的要求,其中有一些不符合你要求的地方,对其进行修改,修改的过程中,你就必须要去了解它的功能实现步骤,这个步骤使用得多了,你有脑海里就会建立起一个JS程序编写的流程概念,给自己独立写代码打下基础

这个过程以及第三步甚至是以后,你都需要用到搜索引擎,学习如何使用搜索引擎来准确查找你要实现的某个细节功能;

【第三步】

开始尝试自己写代码,将一些以前写过的或者没写过的重新按自己的思路写,或者原创一个实用的功能。

写代码的时候同样和第二步一样,需要进行大量的知识吸纳过程,这时候你慢慢地会对JS的宏观轮廓有一个更清晰的认识过程,比如JS内部都有哪些内置类,它的核心之外都有哪些对外接口,比如DOM、window等。

这个过程中,多多去一些问答社区去找一些网友提问的问题,尝试独立解决它们,在帮助别人的同时,对自己的知识积累才是最主要的。

【第四步】

这个时候你已经是一个JS老手了,寻找一些稀奇古怪的代码,来了解JS更细化的知识,弥补对JS的认识空白和以往的误区。

同时,编写自己的JS库,比如针对浏览器兼容性而开发的动画库、常用简化库等。

学习和使用已有的JS库,比如jquery等。

——————

以上的步骤基本是学习的流程,但不见得非要按步就班,如果你的学习能力很强,可以将第二、三步同步进行。

另外,多去JS的相关知识站点学习,下面给你提供一些这样的站点:

参考资料:

【w3school中国站】 http://www.w3school.com.cn/js/index.asp

【w3schools国际站】http://www.w3schools.com/js/default.asp

【微软JScript官方教程】http://msdn.microsoft.com/zh-cn/library/72bd815a.aspx

1:调用关键字function来构造

 function distance(x1,x2,y1,y2) 

var dx=x2-x1 

var dy=y2-y1 

return Math.sqrt(dx*dx+dy*dy) 

}

2:使用Function()构造函数(请注意与上面的大小写)

var f=new Function*"x","y","return x*y")

这行代码创建了一个新函数,该函数和你所熟悉的语法定义的函数基本上时等价的:

function f(x,y) 

    return x*y 

}

Functino()构造函数可以接受任意多个字符串参数。它的最后一个参数时函数的主体,其中可以包含任何JavaScript语句,语句之间用分号分隔。其他的参数都是用来说明函数要定义的形式参数名的字符串。如果你定义的函数没有参数,那么可以只需给构造函数传递一个字符串(即函数的主体)即可。 

注意,传递给构造函数Function()的参数中没有一个用于说明它要创建的函数名。用Function()构造函数创建的未命名函数有时被成为“匿名函数”。 

你可能非常想知道Function()构造函数的用途是什么。为什么不能只用function语句来定义所有的函数呢?原因是Function()构造函数允许我们动态地建立和编译一个函数,它不会将我们限制在function语句预编译的函数体中。这样做带来的负面影响效应就是每次调用一个函数时,Function()构造函数都要对它进行编译。因此,在循环体中或者在经常使用的函数中,我们不应该频繁地调用这个构造函数。 

使用Function()构造函数的另一个原因是它能够将函数定义为JavaScript表达式的一部分,而不是将其定义一个语句,这种情况下使用它就显得比较的方面,甚至可以说精致。

 3:函数直接量 

函数直接量是一个表达式,它可以定义匿名函数。函数直接量的语法和function语句非常相似,只不过它被用作表达式,而不是用作语句,而且也无需指定函数名。下面的三行代码分别使用function()语句、Funciont()构造函数和函数直接量定义了三个基本上相同的函数:

 function f(x){return x*x} 

var f=new Function("x","return x*x") 

var f=function(x){reurn x*x}

在JavaScript1.1中,可以使用构造函数Function()来定义函数,在JavaScript1.2和其后的版本中,还可以使用函数直接量来构造函数。你应该注意这两种方法之间的重要差别。 

 

首先,构造函数Function()允许在运行时动态地创建和编译JavaScript代码。但是函数直接量却是函数结构的一个静态部分,就像function语句一样。 

其次,作为第一个差别的必然结果,每次调用构造函数Function()时都会解析函数体并且创建一个新东汉数对象。如果对构造函数的调用出现在一个循环中,或者出现在一个经常被调用的函数中,这种方法的效率非常低。另一个方面,函数直接量或出现在循环和函数中的嵌套函数不是在每次调用时都被重新编译,而且每当遇到一个函数直接量时也不创建一个新的函数对象。 

Function()构造函数和函数之间量之间的第三点差别是,使用构造函数Function()创建的函数不使用词法作用域,相反的,它们总是被当作顶级函数来编译,就像下面代码所说明的那样: