如何在对象中更改此内容?

时间:2013-08-22 23:29:10

标签: javascript object this

如何创建方法两次?我无法理解如何在功能体中改变它。为什么它不起作用?

function twice() {
    var buf = [];
    for ( var i = 0; i < this.length; i++ ) {
        buf.push(this[i]);
    }

    for ( var i = 0; i < this.length; i++ ) {
        buf.push(this[i]);
    }
    this = buf;
}

Array.prototype.twice = twice;

a = [1,2,3];
a.twice(); 
a; // [1,2,3,1,2,3]

2 个答案:

答案 0 :(得分:2)

您无法为this分配值。这是规则。但您可以修改 this的值。尝试将一些值推送到this

function twice() {
    var len = this.length;
    for (var i = 0; i < len; i++) {
        this.push(this[i]);
    }
}

Array.prototype.twice = twice;

a = [1, 2, 3];
a.twice();
alert(a);

这是一个小提琴。 http://jsfiddle.net/Qvarj/正如您所看到的,大部分逻辑都属于您。

答案 1 :(得分:2)

  

我无法理解如何在功能体中改变它

如果您的意思是this的值,则不能。但你没有必要为你正在做的事情

你非常接近,你只需要删除一下:

function twice() {
    var i, l;
    for (l = this.length, i = 0; i < l; ++i) {
        this.push(this[i]);
    }
}

请记住,您的数组是一个对象。要更改其内容,只需更改其内容,您无需更改对其的引用。

但请注意,您可以在任何现代浏览器上使用此技巧:

function twice() {
    this.push.apply(this, this);
}

这可以通过使用Function#apply函数来调用你调用它的函数(在我们的例子中是push),使用你给它作为操作对象的第一个参数,第二个参数作为传递给该函数的参数(它作为一个数组)。更多on MDNin the spec。碰巧push允许您传递任意数量的参数,并按顺序推送每个参数。因此,如果您尝试第二次将数组的内容添加到数组中,那一行就会执行此操作(在现代浏览器中,一些较旧的IE实现不喜欢使用push.apply)。 / p>