我的问题涉及将新方法添加到现有String 构造函数 的应用程序。在 Stoyan Stefanov 的 Object Oriented Program for Javascript 中,有一个使用 Array 构造函数的 .reverse() 方法为 String 构造函数创建一个的示例。 下面是示例:
String.prototype.reverse = function() {
return Array.prototype.reverse.apply(this.split('')).join('');
}
我以为Array的.reverse()方法直接属于Array的对象。事实上,当我尝试使用此语句执行第二段代码时:,
String.prototype.reverse = function() {
return Array.reverse.apply(this.split('')).join(''); //WITHOUT the .prototype
}
var rev = "karunesh".reverse(); //applying the code here
我在 Firebug 控制台中收到一条错误消息:“类型错误:调用函数 Array.reverse 时缺少参数 0”。这对我来说没有任何意义。
当然,如果我在 .prototype 中添加回来,它会工作得很好。
另外,如果我必须调用原型(prototype)来访问 Array 对象的 .reverse() 方法, 那么我是不是这样必须为 Javascript 中的任何内置对象执行此操作?
提前感谢您的帮助!
最佳答案
Is it the case that I have to call upon prototype to access the .reverse() method from the Array object
没有。要访问对象上的方法,只需使用点符号访问它。你想做的很简单
return this.split('').reverse().join('');
这就是apply
(或 call
)做:
var arr = this.split('');
return arr.reverse.apply(arr).join('');
最后是 arr.reverse === Array.prototype.reverse
因为那是 Array
对象继承的地方。您不是在访问 Array
构造函数对象本身的 reverse
方法,而是访问所有 Array
实例 分享 - 通过他们的原型(prototype)。然而,您几乎不需要显式使用原型(prototype)对象,只有当您处理不是 Array
实例(不共享原型(prototype))的对象时,如 arguments
对象或 NodeList
。
TypeError: missing argument 0 when calling function Array.reverse
. That does not make any sense to me.
Array.reverse
是一个非标准的 Array
generic method仅在 Firefox 中可用。它的目的是简化将 Array 原型(prototype)方法应用于其他对象的构造,并且它确实将类数组对象作为第一个参数。一个例子:
Array.reverse([0, 1]) // [1, 0]
相当于
Array.prototype.reverse.apply([0, 1]);
然而,你在做
Array.reverse.apply([…]/*, undefined*/)
它使用(不相关的)this
value 的数组调用 Array.reverse
函数并且没有实参,等同于
Array.prototype.reverse.apply(undefined)
然后抛出正确的异常。
关于javascript - Javascript 中的 Array.prototype.reverse 和 Array.reverse 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18680163/