我可以使JavaScript对象返回任意值而不是返回自身吗?

时间:2014-02-27 13:44:21

标签: javascript

是否可以在JavaScript中创建一个返回任意值而不是返回自身的对象?

例如:

function myCollection() {
  var items = []

  return {
    push: function(value) {
      value += 'bar'
      items.push(value)
    },

    toReturn: function() {
      return items
    }
  }
}

var fooCollection = myCollection()

fooCollection.push('foo')

return fooCollection // is there a way to make this return ['foobar']?

所以,我想创建一个像JavaScript数组一样的对象。数组有方法,但是当您返回数组时,您将获得数组值。你没有得到一个对象。

3 个答案:

答案 0 :(得分:1)

您可以使myCollection函数使用您想要的任何新方法丰富items数组,然后返回items

function myCollection() {

    var items = [];

    items.push = function (value) {
        value += "bar";

        // call Array's push method to push new value onto items
        Array.prototype.push.call(items, value);
    };

    return items;
};

var fooCollection = myCollection();

fooCollection.push('foo');

console.log(fooCollection); // logs ['foobar', push: function]

问题在于,当您记录fooCollection时,它会记录数组的内容,但它也会记录新的push方法。

幸运的是,上面的fooCollection仍有1的长度,而fooCollection[0]仍然是'foobar'。因此,日志输出中的此push属性可能不会妨碍将fooCollection用作数组。


或者,您可以定义一个扩展MyCollection的{​​{1}}类,并重新定义您想要的任何方法。

在我看来,这种方式比上面更具有javascripty。在上方,每次调用Array时,都会创建一个myCollection对象并重新定义其Array方法。在这里,您只需在push类上定义一次自定义push方法。

MyCollection

答案 1 :(得分:0)

没有办法做到这一点。返回只能用于指定函数的返回值。来源:Mozilla Developer Network

答案 2 :(得分:0)

如果您希望对象是类似数组,则可以执行以下操作:

function myCollection() {
  var items = [], r = {}
  function myPush(value){
      value += 'bar'
      r[items.length]=value;
      items.push(value)    
  }
  Object.defineProperty(r, "splice", {value:[].splice});
  Object.defineProperty(r, "slice", {value:[].slice});
  Object.defineProperty(r, "length", {
    get : function(){ return items.length}
  });
  Object.defineProperty(r, "myPush", {value:myPush});
  return r;
}

var fooCollection = myCollection();
fooCollection.myPush('foo');
console.log(fooCollection); // logs ["foobar"] 
fooCollection.myPush('Ba');
console.log(fooCollection); // logs ["foobar", "Babar"] 

fooCollection.myPush('wzouing');
console.log(fooCollection.slice(-2)); // logs ["Babar", "wzouingbar"] 
console.log(fooCollection[1]); // logs Babar 

Demonstration