Function 构造器及其对象、方法
一、基础
Function 是一个构造器,能创建Function对象,即JavaScript中每个函数实际上都是Function 对象。
构造方法: new Function ([arg1[, arg2[, ...argN]],] functionBody)
说明:arg1、arg2等为构造器的参数,functionBody为方法体。注意:参数必须用引号包围!
实例:
var plus=new Function("a","b","return a+b");
var result=plus(1,2);//调用,返回3
上述方法创建function等同于普通函数声明方法:
function plus(a,b){return a+b;};
重点:
1、使用Function构造器生成的对象是在函数创建时解析的(即真正调用时才生成对象的模型),所以比普通函数声明方法低效,因为普通方法是和其它代码一起解析的;
2、此方法不支持闭包,即不能访问创建他的所在function对象的私有变量,而只能访问自身参数列表中的变量和全局变量,因此一般只作为全局函数时使用。如:
<script>
var test=1;//用于测试的全局变量
var plus=new Function("a","b","return a+b+test");
alert(plus(1,2));//将提示结果为4,即访问到了test变量
function adder(value){
var number=value;//定义私有变量
alert("标记1");
this.method=new Function("a","b","return a+b+number");
}
var operation=new adder(1);
alert("标记2");
alert(operation.method(1,2));//提示了标记1与标记2,但此处没结果(出错),若将method的定义中number改为全局变量test,将运行出结果4。可见Function构造器方法确实不能实现闭包。
</script>
二、原型的属性
属性:
1、arguments属性:(已不建议使用)
function.arguments 属性:代表传入函数的实参,它是一个类数组对象。已废弃。例:
function test(var1,var2){
alert(test.arguments[0]+test.arguments[1]);
}
注意:
1)、使用函数名调用;2)、arguments数组访问的是本次函数调用时传入的实参,而非上一次调用时的参数(对于嵌套或循环调用需注意!)。推荐使用函数内部的arguments对象:。
arguments对象:
该对象是函数内部的本地变量,而不是函数的属性。使用示例:
function test(var1,var2){
arguments[0]=0;//可改变参数的值
alert(arguments[0]+arguments[1]);
}
test(1,2);//将提示结果为2
说明:
arguments对象并不是一个真正的Array对象,没有数组的属性与方法(length除外)。可通过继承数组的slice方法获得参数数组:
var args = Array.prototype.slice.call(arguments);
不建议使用此方法获得参数数组,因为slice方法会影响js引擎的优化(如v8引擎)。最好使用遍历arguments获取参数生成数组。
arguments对象属性:
length、callee等。arguments.callee返回该arguments对象所属的函数构造器(即函数),从而可实现匿名函数的递归等。如:
说明:全兼容。
具体查看:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments
2、caller属性:返回调用函数名
例:
说明:全兼容。
3、length:函数期望的参数个数
length 是函数对象的一个属性值,指明该函数期望多少个参数,意即形参的个数。数量不包括剩余参数。相比之下, arguments.length 是函数被调用时实际传参的个数。
4、name:字符串形式返回函数名
例:alert(test.name);//弹出test函数的函数名test。
注:有的浏览器不支持。
5、prototype:原型,最重要的属性
三、方法
apply()、call()、bind()、toSource()、toString()、isGenerator()六个。
1、apply方法
常用,语法:
B.prototype.method.apply(A [,args]);
作用:
构造器B的原型的method方法(也即B的对象所具有的方法,理解了原型链此处很好理解)提供给对象A,使用,args为需要传入的method的参数,为数组或数组字面量(如[1,2]的形式)。
注意:
B必须为构造器名(即函数名),A为某个将使用此method函数的对象。
示例:
更深细节:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
2、call方法
与apply方法相似,但参数采用参数列表的形式。
语法:
fun.call(thisArg[, arg1[, arg2[, ...]]])
此处fun可是任何方法,将fun方法用于thisArg对象,也实现了继承的模拟(thisArg相当于继承了fun方法)。
示例:
上面的Food相当于:
3、bind方法
语法:
fun.bind(thisArg[, arg1[, arg2[, ...]]])
作用:
将fun方法绑定给thisArg对象。相当于将方法fun写在thisArg的构造器里面,所以fun里面使用到的this此时指的是fun所属的thisArg 对象。
示例:
Function 是引用类型,所以也具有length属性、valueOf与toString 方法。应该将所有function都看做Function 的对象,函数名即该对象的引用!
上面只是基本用法,更多知识参考手册!
参考:
MDN知识库Function属性与方法:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/caller
Function 构造器及其对象、方法的更多相关文章
- jQuery源码06-jQuery = function(){};给JQ对象,添加一些方法和属性,extend : JQ的继承方法,jQuery.extend()
/*! * Includes Sizzle.js 选择器,独立的库 * http://sizzlejs.com/ */ (function( window, undefined ) { //" ...
- Oracle自定义数据类型 2 (调用对象方法)
调用对象方法 调用对象方法基于类型创建表后,就可以在查询中调用对象方法 A. 创建基于对象的表语法: create table <表名> of <对象类型>意义 ...
- 翻译:用Javascript的Function构造器伪造上下文 by Ben Nadel
在我的jQuery模板标记语言(JTML)项目中,我需要一种方式将JTML模板编译到JS函数,这样它们就可以如期地在任何时候转换成新的HTML标记.但这是一个严峻的问题,因为JTML代码涉及非作用域( ...
- 25 JavaScript对象原型&ES5新的对象方法
JavaScript对象原型 所有JavaScript对象都从原型继承对象和方法 日期对象继承自Date.prototype,数组继承自Array.prototype,对象构造器新建的对象Person ...
- js 继承 对象方法与原型方法
js函数式编程确实比很多强语言使用灵活得多,今天抽了点时间玩下类与对象方法调用优先级别,顺便回顾下继承 暂时把原型引用写成继承 先看看简单的两个继承 var Parent = function(){} ...
- 学习zepto.js(对象方法)[4]
今天说说那一套获取元素集合的一些方法: ["children", "clone", "closest", "contents&qu ...
- 学习zepto.js(对象方法)[1]
zepto也是使用的链式操作,链式操作:函数返回调用函数的对象. 但并不是所有的对象方法都可以进行链式操作,举几个例子:.size(),.html()|.text()//不传参数的情况下; 若非特殊说 ...
- js 对象方法、类方法、原型方法的区别;私有属性、公有属性、公有静态属性的区别
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- javascript最新深度克隆对象方法
javascript最新深度克隆对象方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...
随机推荐
- 怎么从传统的盒子思想转为Flex 布局(css)
前端进化很快,总是有新的技术出来,开始可能有些人用惯了盒子模型的思想 依赖 display属性 + position属性 + float属性.这三大件.它对于那些特殊布局非常不方便 我们就来看看Fle ...
- html 报告页面样式
修改了下HTML页面样式 页面代码 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- C++ 资源大全中文版
标准库 C++标准库,包括了STL容器,算法和函数等. C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分. Standard Tem ...
- cent OS官网上下载老版本系统镜像的正确打开方式
当时的情况是这样的: 客户需要给服务器安装cent OS 7.3操作系统,我打开官网https://www.centos.org/,点击“GET CENTOS”——>“Minimal ISO”, ...
- 2013 - lost connection to mysql server at 'reading initial communication packet' 连接mysql报错
早上刚到公司,启动项目发现连接池初始化报错,于是我打开本地mysql管理工具,测试是否可以连接.报错2013代码: 现已解决. 重启服务器mysql服务就好. 因为我连接的是本地windows系统,所 ...
- Linux 常用密令总结 ------随用随记吧
ubuntu or uqilin 目录文件类ls 查看目录cd 转到目录ps -aux查看所有进程grep 查找| 管道符 用户账户类 su 切换用户sudo 以管理员权限运行命令重启机器 reboo ...
- 学习EXTJS6(7)基本功能-最常用的表单
开发过程中关于表单的处理无非: 1.表单和表单元素 2.实现表单验证 3.表单的提交和加载 -------------------------------------- 1.Ext.form.Basi ...
- Netty学习总结(3)——Netty百万级推送服务
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- docker 容器操作( 以 tomcat 为例 )
一.容器操作 一个镜像可以启动多个容器.比如一个 tomcat 镜像,可以启动多个tomcat 容器,启动后的这些 tomcat 都是各自独立的 二.步骤 1.搜索镜像 [root@localhost ...
- orcale 基本查询(1)
orcale 基本查询 查询当前用户下的所有表: select * from tab; 查询表结构: desc 表名设置行宽: set linesize 120;设置列宽: 数值类型: col 列名 ...