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对象所属的函数构造器(即函数),从而可实现匿名函数的递归等。如:

function create() {
   return function(n) {
      if (n <= 1)
         return 1;
      return n * arguments.callee(n - 1);//调用该arguments所属的匿名函数构造器。
   };
}
var result = create()(5); // returns 120 (5 * 4 * 3 * 2 * 1)  

说明:全兼容。

具体查看:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments

2、caller属性:返回调用函数名

例:

function myFunc() {
   if (myFunc.caller == null) {
      return ("该函数在全局作用域内被调用!");//在全局被调用时caller值为null
   } else
      return ("调用我的是函数是" + myFunc.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函数的对象。

示例:

function A(var1,var2){
    this.v1=var1;
    this.v2=var2;
    //this.method=function(){ alert(this.v1+this.v2);}此种方式将不能应用apply等方法
}
A.prototype.method=function(){ alert(this.v1+this.v2);}
function B(){
    this.v1=10;
    this.v2=20;
}
var a=new A(1,2);
b=new B();
a.method();//提示结果:3
A.prototype.method.apply(b);//将构造器A的method方法应用与对象b。因为method没有参数,所以参数数组省略。
b.method();//真正调用,若带有参数,此处可不用再写,写在apply参数列表即可。提示结果:30  

更深细节:

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方法)。

示例:

[plain] view plain copy

function Product(name, price) {
  this.name = name;
  this.price = price;  

  if (price < 0) {
    throw RangeError(‘Cannot create product ‘ +
                      this.name + ‘ with a negative price‘);
  }
}
function Food(name, price) {
  Product.call(this, name, price); //Food对象继承了Product方法
  this.category = ‘food‘;
}  

上面的Food相当于:

[plain] view plain copy

function Food(name, price) {
    this.name = name;
    this.price = price;
    if (price < 0) {
        throw RangeError(‘Cannot create product ‘ +
                this.name + ‘ with a negative price‘);
    }  

    this.category = ‘food‘;
}  

3、bind方法

语法:

fun.bind(thisArg[, arg1[, arg2[, ...]]])

作用:

将fun方法绑定给thisArg对象。相当于将方法fun写在thisArg的构造器里面,所以fun里面使用到的this此时指的是fun所属的thisArg 对象。

示例:

[plain] view plain copy

this.x = 9;
var module = {
  x: 81,
  getX: function() { return this.x; }
};
module.getX(); // 返回 81
var retrieveX = module.getX;
retrieveX(); // 返回 9, 在这种情况下,"this"指向全局作用域  

// 创建一个新函数,将"this"绑定到module对象
// 新手可能会被全局的x变量和module里的属性x所迷惑
var boundGetX = retrieveX.bind(module);
boundGetX(); // 返回 81  

Function 是引用类型,所以也具有length属性、valueOf与toString 方法。应该将所有function都看做Function 的对象,函数名即该对象的引用!

上面只是基本用法,更多知识参考手册!

参考:

MDN知识库Function属性与方法:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/caller

原文地址:https://www.cnblogs.com/whqblog/p/9013116.html

时间: 2024-10-23 17:31:43

Function 构造器及其对象、方法的相关文章

jQuery源码06-jQuery = function(){};给JQ对象,添加一些方法和属性,extend : JQ的继承方法,jQuery.extend()

/*! * Includes Sizzle.js 选择器,独立的库 * http://sizzlejs.com/ */ (function( window, undefined ) { //"use strict"; var // rootjQuery = jQuery(document) = $();压缩有用 rootjQuery, // dom是否加载完 readyList, // core_strundefined == 'undefined' core_strundefined

三,遍历方法 1$.each(数组/对象,function处理); //$对象 调用的 2$(选择器).each(function处理); //jquery对象 调用的

1$.each(数组/对象,function处理);  //$对象 2$(选择器).each(function处理);   //jquery对象

Oracle自定义数据类型 2 (调用对象方法)

调用对象方法 调用对象方法基于类型创建表后,就可以在查询中调用对象方法 A. 创建基于对象的表语法: create   table   <表名>   of   <对象类型>意义:此表具有该类型和member方法的所有属性, 我们不能通过DBA   STUDIO的表数据编辑器来编辑数据. 例:create   table   FLIGHT_SCH_TAB   of   FLIGHT_SCH_TYPE insert   into   FLIGHT_SCH_TAB     values(

20160122:开始学VBA:(一)、宏与VBA/(二)、VBA语句对象方法属性

从今天开始跟着<兰色幻想>视频学习VBA 宏其实就是操作步骤 录制宏是自动生成的VBA 在VB中可以自己编写 都可以通过窗体按钮指定宏 1. VBA对象 '1.工作簿       ' Workbooks 代表工作簿集合,所有的工作簿,Workbooks(N),表示已打开的第N个工作簿      ' Workbooks ("工作簿名称")      ' ActiveWorkbook 正在操作的工作簿      ' ThisWorkBook '代码所在的工作簿        '

js中String常用方法详解及String对象方法扩展

一.JavaScript 中 slice .substr 和 substring的区别: 1: String.slice(start,end): 一个新的字符串.包括字符串 stringObject 从 start 开始(包括 start)到 end 结束(不包括 end)为止的所有字符. 2: String.substring(start,end) 这个就有点特别了,它是先从start,end里找出一个较小的值. 然后从字符串的开始位置算起,截取较小值位置和较大值位置之间的 字符串,截取出来的

JavaScript正则表达式-相关的String对象方法

JavaScript正则表达式相关的String对象方法有三个: 1.match(). 2.replace(). 3.search(). match() match(regExp); 使用指定的正则表达式来搜索字符串. 如果找到匹配字符串返回一个数组,否则返回null. 返回的数组包含两个属性:index和input. index是匹配字符串在原字符串中的位置. input属性是对原字符串的引用. var reg_pattern = /a\d/; var str = "apple,a2,b3,a

类方法与对象方法

js函数式编程确实比很多强语言使用灵活得多,今天抽了点时间玩下类与对象方法调用优先级别,顺便回顾下继承 暂时把原型引用写成继承 先看看简单的两个继承 var Parent = function(){}; var b = new Parent(); Object.defineProperty(b,"Name",{value:"John",writable:true}); var A = function(){}; A.prototype= b; var a = new

Gobject的对象方法

Gobject的对象方法有如下几种: 1.非虚拟公共方法2.虚拟公共方法3.虚拟私有方法 1.非虚拟公共方法 这个是最简单的,提供了一种作用于对象的简单方法. 在头文件中提供函数原型,并在源文件中提供该原型的实现. /* declaration in the header. */ void viewer_file_open (ViewerFile *self, GError **error); /* implementation in the source file */ void viewer

对象方法等

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为 由类创建对象,由对象调用方法!类里包括属性 行为(方法)方法是为了提高代码的灵活性:例如重载(多态) 重载: 1,参数个数不同 2,参数的类型不同 3,参数的顺序不同 与返回值无关,修饰符 无关 (1)方法里定义的局部变量和参数是等价的 如果出现了 参数和 局部