所以我有一个类,让我们称之为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完成的,它的get、put等方法希望在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,每个都有不同的put、get等方法。但是,插入的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();