首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么构造函数中需要应用()函数

为什么构造函数中需要应用()函数
EN

Stack Overflow用户
提问于 2011-09-13 11:43:04
回答 5查看 502关注 0票数 5
代码语言:javascript
运行
复制
function Set() {          // This is the constructor
    this.values = {};     
    this.n = 0;          
    this.add.apply(this, arguments);  // All arguments are values to add
}

// Add each of the arguments to the set.
Set.prototype.add = function() {
    /* Code to add properties to the object's values property */
    return this;
};

这是"Javascript:权威指南“中用来创建”Set“类的代码的开始。我试图使构造函数中apply()函数的必要性变得合理,但终究弄不明白。

代码语言:javascript
运行
复制
this.add.apply(this, arguments);

如果add()函数已经是'this‘调用的方法,那么核心apply()函数实现的目的或用途是什么。提前感谢任何试图向我解释这一点的人

http://jsfiddle.net/Marlin/Ydwgv/ -来自Javascript的完整示例:权威指南

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-13 11:48:04

“如果add()函数已经是由'this‘调用的方法,那么核心应用()函数实现的目的或用途是什么。”

这样arguments就可以作为整个集合传递。如果Set接受不确定数量的参数,则此函数非常有用。

票数 7
EN

Stack Overflow用户

发布于 2011-09-13 11:48:09

构造函数中不需要它--事实上,它与一般的构造函数没有任何关系(但显然它与这个特定的构造函数有关;-)。apply所做的就是确保目标函数被“正确”调用。

也就是说,apply,当给定一个类似数组的对象* (arguments计数)、[n1, n2, ... n3]和一个函数f时,它会将目标函数调用为f(n1, n2, ... n3)apply还接受"this context“,该上下文在代码中传递给新创建的对象(以使其看起来好像add是”作为普通方法“被调用的)。有关更多信息/示例,请参阅上面的链接。

这意味着,对于上面的代码,

代码语言:javascript
运行
复制
var s = new Set(1, 2, 3)

代码语言:javascript
运行
复制
var s = new Set()
s.add(1, 2, 3)

是等价的。

祝你编码愉快。

*在FireFox 4之前的版本中,它必须是数组本身。这就是为什么有时代码会使用丑陋的习惯用法:

代码语言:javascript
运行
复制
f.apply(context, Array.prototype.slice.call(arguments, 0))
票数 2
EN

Stack Overflow用户

发布于 2011-09-13 11:48:27

我相信调用它不是为了作用域,而是apply将接受一个参数数组并按顺序传递它们:

代码语言:javascript
运行
复制
this.add.apply(this, [1,2,3,4]);
....
function add(one, two, three, four)

没有一个参数是数组

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7396552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档