是否可以在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数组一样的对象。数组有方法,但是当您返回数组时,您将获得数组值。你没有得到一个对象。
答案 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