如何获得外部“;这个“;JavaScript中的引用

How to get the outer "this" reference in JavaScript

本文关键字:引用 JavaScript 这个 何获得 外部      更新时间:2023-09-26

所以我有一个类,让我们称之为a。对于这个类,我写了一些函数,我可以这样调用:

var a = new A();
a.getSomething();
a.putSomething();
a.delSomething();

等等。现在我想我应该把它整理一下,这样它就不会太乱,看起来会更像这样:

a.something.get();
a.something.put();
a.something.del();

这就是我试图实现这一目标的方式:

A.prototype.something = {
  get: function(){...},
  put: function(){...},
  del: function(){...}
};

但是这些函数(get、put和del)仍然需要访问A中的常见对象/函数,所以我需要对A的引用,但我不知道如何实现。

我发现的一个选项是这样的:

A.prototype.something = function(){
  var that = this;
  return {
    get: function(){...},
    ...
  };
}; 

"that"将用于那些(get、put和del)函数,而不是"this"。但这意味着我必须以这样的方式调用这些函数:

a.something().get();
...

这对我来说似乎不太好。那么有没有办法让我按照最初的计划来组织这些事情呢?

您不能将其添加到原型中,因为something成员在所有对象上都不相同——在内部,其方法必须获得外部对象的闭包,而在执行时无法获得该闭包。

你需要在构造函数中完成:

function A() {
    var that = this;
    this.something = { 
       get: function(){...}, 
       ... 
    };
}

所以我有一个类

Javascript没有类。它具有原型继承,可以在一定程度上模拟类,但纯粹为了模拟类,这是不值得的。与其试图让javascript模仿其他语言,不如优化利用内置的语言功能。

所以你有一个构造函数。。。

我已经写了一些函数,我可以这样调用:

var a = new A();
a.getSomething();
a.putSomething();
a.delSomething();

据推测,这些方法都在A.prototype上。

等等。现在我想我应该把它整理一下,这样它就不会太乱,看起来会更像这样:

a.something.get();
a.something.put();
a.something.del();

(对我来说)那也没那么杂乱。我想有一些常见的事情是由something完成的,它的getput等方法希望在a上操作,而不是在something上。

this的值由调用设置,除了使用ES5绑定之外,没有其他方法可以设置其值。因此,被调用的方法必须以某种方式访问a。其他答案显示了如何使用闭包来实现这一点,但结果是每个实例都必须有自己的something对象和附加的方法。

以下是类似的,但为了提高效率,去掉了闭包并将方法放在Something.prototype上:

function A(name) {
    this.name = name;
    this.something = new Something(this);
}

function Something(that){
    this.that = that;
}
Something.prototype.get = function() {
    return this.that.name;
}
Something.prototype.put = function(prop, value) {
    this.that[prop] = value;
}
var a = new A('a');
alert(a.something.get());     // a
a.something.put('name', 'z');
alert(a.something.get());     // z

因此,您可以有多个something,每个都有不同的putget等方法。但是,插入的something对象实际上只是一个使用更多内存(可能是少量内存)并需要额外字符的设备。更简单的是在A.prototype上保留something方法,而不必键入额外的句点(.)。

function A() {
  this.something = this;
}
A.prototype = {
  get: function(){...},
  put: function(){...},
  del: function(){...}
};

因此:

a.something.get();
a.something.put();
a.something.del();