首页 > 解决方案 > 如何将函数作为方法添加到返回的数组?

问题描述

我有一个打算与new构造函数一起使用的函数。它应该返回一个值为 的数组,["Hello World"]并将函数作为方法包含在内。这是一个示例/演示(对不起,如果它有点难看):

var my_object = function () {
  this.foo = function (data) { // alert and add new item
    alert(data);
    this.push(data);
  };

  this.bar = function () { // alert and remove last item
    alert(this.pop());
  };

  this.baz = function (stuff) { // replace last item by running previous methods
    this.bar();
    this.foo(stuff);
  };

  var a = "Hello World";
  return [a];
};

var arr = new my_object(); // ["Hello World"]

正如预期的那样, arr 的值为["Hello World"]。但是,以下代码会产生错误:

arr.foo('some-text'); // "TypeError: arr.foo is not a function"

其他两个函数也会出现相同类型的错误。在不更改 Array.prototype、在函数外部创建方法或删除初始化的能力的情况下,我能做些什么来完成这项工作new my_object()

注意:如果可能,请不要包含使用 jQuery 或其他外部库的答案。

标签: javascriptarraysfunctionobjectmethods

解决方案


正如评论中提到的,这个链接有一些有价值的信息-> https://github.com/wesbos/es6-articles/blob/master/54%20-%20Extending%20Arrays%20with%20Classes%20for%20Custom%20Collections .md

使用它,您的代码可以像这样修改。->

当然这是ES6,在几天内不可能扩展数组ES5..

在 Chromeinstanceof中,当映射按预期工作时,如果这是必需的,则不确定转译的代码是否可以在这里工作。例如,如果您单击此代码段上的使用 Babel 预设,您将看到它失败,因此如果您希望它在旧浏览器上工作,即使已转译也可能是一个问题。

class my_object extends Array {
  foo(data) {
    alert(data);
    this.push(data);
  }

  bar() {
    alert(this.pop());
  }

  baz(stuff) {
    this.bar();
    this.foo(stuff);
  }

  constructor () {
    super("Hello World");
  }
};

var arr = new my_object(); // ["Hello World"]
arr.foo("some-text");

console.log(arr);


推荐阅读