javascript - Javascript 中的 Array.prototype.reverse 和 Array.reverse 有什么区别?

标签 javascript oop object prototype

我的问题涉及将新方法添加到现有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/

相关文章:

javascript - 正确实现弹出式联系表格

c# - 由于保护级别而无法访问类属性

java - 如何使用 "static"方法面向对象设计对象层次结构

c - 结构声明是否占用内存?

ajax - 在 jquery ajax 中传递嵌套对象

javascript - React Native、MobX 和生命周期

javascript - AngularJS:组件和依赖注入(inject)

javascript - 清理稍后将出现在 HTML 中的输入

php - 这是在 oop php 中使用准备好的插入语句的正确方法吗?

JavaScript:如何反对字符之间的推送字符串?