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