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

Javascript 使用原型时如何引用父对象?,javascript,arrays,oop,function,prototype,Javascript,Arrays,Oop,Function,Prototype,我已经创建了一个实用函数,它包含在我编写的几乎所有Javascript代码中。该函数的目的是简单地从数组中删除一个元素。它接受一个数组和一个索引作为参数,并返回已删除所需元素的数组 下面是函数: sliceHere = function(array, i) { buffOne = array.slice(0, i); buffTwo = array.slice(i + 1); return buffOne.concat(buffTwo); } 它很好

我已经创建了一个实用函数,它包含在我编写的几乎所有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
成为所有数组的一种方法。因此,我可以简单地执行
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”可能不是实际的数组如何从方法内部引用数组?

始终为只读,因此您无法为其分配新数组,您应该返回一个更新的值。以下是您的示例的更新版本:

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

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

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

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

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
};
Array.prototype.sliceHere=函数(i){
var i_want_you=this.slice(0,i).concat(this.slice(i+1));
这个长度=0;

这个.push.apply(这个,我想要你);//你为什么要重新发明轮子?已经做了同样的事情:

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
};
Array.prototype.sliceHere=函数(i){
var i_want_you=this.slice(0,i).concat(this.slice(i+1));
这个长度=0;

这个。推。应用(这个,我想要你)斯蒂德,他毕竟回答了我的问题。@Bane这是你第一次拷贝代码片段,这才是真正的答案?
:'(
@Bane更新了我的答案。不过这是一个方轮。我不认为重新发明轮子总是消极的。学生们必须一直这样学习。我是一个学生,如果我没有尝试重新发明轮子,我就不会知道这一点。另外,
到底推动了什么。应用
做了什么?当然,但这对以后的阅读可能还是很好的我想,我会接受谢尔盖的回答,他毕竟回答了我的问题。@Bane这是你第一个被复制的代码片段,这才是真正的答案?
:'(
@Bane更新了我的答案。不过这是一个方轮。我不认为重新发明轮子总是消极的。学生们必须一直这样做才能学习。我是一个学生,如果我没有重新发明轮子,我就不会知道这一点。还有,
到底推动了什么。应用
做了什么?因此,实际上没有办法编写into对象?如果是这样,
splice
是如何工作的,那么?
splice
修改现有实例,不会替换对象。您可以调用对象方法,更改其属性值,但不能,您不能使其指向另一个对象。您可以:
while(i
(请注意,在本例中我有意避免使用
拼接
,因为这会使整个练习变得毫无意义)因此,无法以某种方式实际写入对象?如果是这样,
splice
是如何工作的,那么?
splice
修改现有实例,不会替换对象。您可以调用对象方法,更改其属性值,但不可以,您不能让它指向另一个对象。您可以:
while(i
(注意,在本例中我故意避免使用
拼接
,因为这会使整个练习变得毫无意义)