如何将函数作为方法添加到返回的数组中?

时间:2019-04-24 13:25:40

标签: javascript arrays function object methods

我有一个打算与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或其他外部库的答案。

2 个答案:

答案 0 :(得分:2)

如评论中所述,此链接包含一些有价值的信息-> https://github.com/wesbos/es6-articles/blob/master/54%20-%20Extending%20Arrays%20with%20Classes%20for%20Custom%20Collections.md

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

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

在Chrome instanceof中,当映射正常时可以正常工作,但是如果需要的话,不确定在这里是否可以使用转码的代码。例如,如果您在此片段上单击“使用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);

答案 1 :(得分:0)

如果您不使用任何Babel或可以安全移植代码的东西,则可以使用inheritance and the prototype chain。 JavaScript默认不是面向对象的编程,而是伪装为OOP。

对于构造函数,您返回["Hello World"],它是数组,不是 my_object 的实例。您可以返回 this 而不是 [a]

此外,您没有任何可引用的数组。使用 this 时,您在本地对象上工作,并且可能有TypeError: this.push is not a function

我改善了你的情况。看看返回值是什么,在哪里使用 this 并引用 data 数组。

问候,李子!

改进的代码:

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

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

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

  var a = "Hello World";
  return this;
};

var arr = new my_object(); // [object Object] - a my_object instance
console.log(arr)
arr.foo('some-text');