如何在使用原型时引用父对象?

cor*_*zza 1 javascript arrays oop prototype function

我已经创建了一个实用程序函数,我在几乎所有我编写的Javascript代码中都包含它.所述函数的目的是简单地从数组中删除一个元素.它接受一个数组和一个索引作为参数,并返回删除了所需元素的数组.

这是功能:

sliceHere = function(array, i)
{
    buffOne = array.slice(0, i);
    buffTwo = array.slice(i + 1);

    return buffOne.concat(buffTwo);         
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好.如果我有一个阵列a = ["a", "b", "c"],我想从中移除"a"它,我只是这样做a = sliceHere(a, 0);.

虽然这确实有用,但我想用更"优雅"的东西取而代之.我想要做的是使函数sliceHere成为我拥有的所有数组的方法.所以我可以简单地做到a.sliceHere(0)并达到同样的效果.这只是一种更好的做事方式,如果我错了就纠正我.

我做的是这样的:

sliceHere = function(i)
{
    buffOne = this.slice(0, i);
    buffTwo = this.slice(i + 1);

    this = buffOne.concat(buffTwo);         
}

Array.prototype.sliceHere = sliceHere
Run Code Online (Sandbox Code Playgroud)

这似乎根本不起作用.因为我知道"这个"可能不是真正的数组.如何从方法内部引用数组?

Rob*_*b W 8

你为什么要重新发明轮子?Array.prototype.splice已经做了同样的事情:

var array = [1, 2, 3];
var i = 1;
array.splice(i, 1);
array; // [2, 3]
Run Code Online (Sandbox Code Playgroud)

好的,让我们重新发明轮子:

拼接:

Array.prototype.sliceHere = function(i) {
    this.splice(i, 1);
};
Run Code Online (Sandbox Code Playgroud)

没有拼接:

Array.prototype.sliceHere = function(i) {
     var i_want_you = this.slice(0, i).concat(this.slice(i + 1));
     this.length = 0;
     this.push.apply(this, i_want_you);  // <-- Modifies all keys, indirectly
};
Run Code Online (Sandbox Code Playgroud)

如果您不希望该方法显示在for(.. in ..)循环中,请使用Object.defineProperty(Array.prototype, 'sliceHere', {value: /*function here*/});.

  • 当然,但是OP的问题的未来读者仍然可能知道实际的答案是什么. (2认同)