12

所以我有一个类,我们称它为 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();
...

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

4

3 回答 3

6

您不能将此添加到原型中,因为something成员在所有对象上都不相同 - 在内部,它的方法必须获得外部对象的闭包,这在执行时是不可能获得的。

您需要在构造函数中执行此操作:

function A() {
    var that = this;
    this.something = { 
       get: function(){...}, 
       ... 
    };
}
于 2012-08-30T00:30:13.203 回答
4

所以我有一堂课

Javascript没有类。它具有原型继承,可以在有限的范围内模拟类,但纯粹为了模拟类是不值得的。更好地利用内置语言功能,而不是试图让 javascript 模拟其他语言。

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

我写了一些可以这样调用的函数:

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

大概这些方法都在 A.prototype 上。

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

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

这并没有减少(对我而言)混乱。我猜有一些常见的事情是由某物完成的,它的getput等方法想要对某物进行操作。

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

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

所以你可以有多个things,每个都有不同的putget等方法。但是介入的东西对象实际上只是一个使用更多内存(可能很小)并且需要额外字符的设备。保持something方法更简单,A.prototype不必键入额外的点 (.)。

于 2012-08-30T02:31:19.867 回答
0
function A() {
  this.something = this;
}
A.prototype = {
  get: function(){...},
  put: function(){...},
  del: function(){...}
};

所以:

a.something.get();
a.something.put();
a.something.del();
于 2012-09-03T09:43:27.730 回答