【问题标题】:How to reference the parent object when using prototypes?使用原型时如何引用父对象?
【发布时间】:2012-06-18 23:04:22
【问题描述】:

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

函数如下:

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

    return buffOne.concat(buffTwo);         
}

它工作得很好。如果我有一个数组a = ["a", "b", "c"],并且我想从中删除"a",我只需执行a = sliceHere(a, 0);

虽然这确实工作,我想用更“优雅”的东西来代替它。我想做的是使函数sliceHere 成为我拥有的 all 数组的方法。所以我可以简单地做a.sliceHere(0) 并达到同样的效果。感觉是一种更好的做事方式,如果我错了,请纠正我。

我做的是这样的:

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

    this = buffOne.concat(buffTwo);         
}

Array.prototype.sliceHere = sliceHere

这似乎根本行不通。因为我知道“this”可能不是实际的数组。 如何从方法内部引用数组?

【问题讨论】:

标签: javascript arrays oop function prototype


【解决方案1】:

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

var array = [1, 2, 3];
var i = 1;
array.splice(i, 1);
array; // [2, 3]

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

带拼接:

Array.prototype.sliceHere = function(i) {
    this.splice(i, 1);
};

无拼接:

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
};

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

【讨论】:

  • 当然,但是对于 OP 问题的未来读者来说,知道实际答案是什么仍然可能会很好。
  • 哦,太好了,我不知道...谢谢我猜,但我会接受谢尔盖的回答,毕竟他确实回答了我的问题。
  • @Bane 这是你的第一个代码 sn-p 复制粘贴,这才是真正的答案? :'(
  • @Bane 更新了我的答案。不过它是一个方形轮子。
  • 我不认为重新发明轮子总是消极的。学生必须一直这样做才能学习。我是一名学生,如果我没有尝试重新发明轮子,我不会知道这一点。另外,push.apply 到底是做什么的?
【解决方案2】:

this 始终是只读的,因此您无法为其分配新数组,而应返回更新后的值。这是您示例的更新版本:

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

    return buffOne.concat(buffTwo);
}

Array.prototype.sliceHere = sliceHere;

var arr = [1, 2, 3];
arr = arr.sliceHere(1);

【讨论】:

  • 所以没有办法以某种方式实际写入到对象中?如果是这样,那么splice 是如何工作的呢?
  • splice 原地修改现有实例,不会发生对象替换。
  • 你可以调用对象方法,改变它的属性值,但是不行,你不能让它指向另一个对象。
  • 你可以:while (i &lt; tail.length) this[i] = this[++i]; this.length--;(请注意,在这个例子中我故意避免使用splice,因为这会使整个练习变得毫无意义)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 2020-07-21
相关资源
最近更新 更多