[英]JavaScript class notation and the 'this' keyword
我知道在这个主题上还有其他一些问题,但是他们似乎都没有给出确凿的答案。
我正在构建一个HTML / CSS / JS移动应用程序,并且一直在尝试使用以下样式的符号来定义一些类:
风格A.
var Thing = (function ()
{
var _instance;
var _firstName;
var _lastName;
function Thing(firstName, lastName)
{
_instance = this;
_firstName = firstName;
_lastName = lastName;
}
Thing.prototype.getMyName = function ()
{
return _firstName + " " + _lastName;
}
Thing.prototype.speak = function ()
{
return ("My name is " + _instance.getMyName());
}
return Thing;
}());
这样做的好处是:
this
前缀)。 _instance
变量,因此避免了this
身份的歧义。 我还尝试了以下替代方案:
风格B.
function Thing(firstName, lastName)
{
this._firstName = firstName;
this._lastName = lastName;
}
Thing.prototype.getMyName = function()
{
return this._firstName + " " + this._lastName;
};
Thing.prototype.speak = function()
{
return "My name is " + this.getMyName();
};
风格C.
class Thing
{
constructor (firstName, lastName)
{
this._firstName = firstName;
this._lastName = lastName;
}
getMyName ()
{
return this._firstName + " " + this._lastName;
}
speak ()
{
return ("My name is " + this.getMyName());
}
}
但是尽管有这些优点,我发现B和C很难处理,因为this
关键字存在问题; 也就是说,根据调用者的上下文, this
可以引用类方法中的不同内容。 此外,在这两种情况下,使用我在A中的_instance
变量是不可能的,因为所有成员都需要以此为前缀this.
。
但是,正如注释中所指出的, 样式A在创建类的多个实例时不起作用。
什么是写这样的类,但避免问题的最好办法this
?
如果你想避免原型方法与后期绑定this
不惜一切代价,你可以使用下面的风格在ES6:
class Thing {
constructor(firstName, lastName) {
this.getMyName = () => firstName + " " + lastName;
this.speak = () => "My name is " + this.getMyName();
}
}
(你也可以使用一个function
的声明,但class
都有,它可以防止通话,而利用new
自动)
您正在创建一个闭包,然后由Thing
构造函数在实例化对象之间共享闭包。 它不会按预期工作。
var elton = new Thing("Elton", "Johnnavartangula");
elton.getMyName(); // <- "Elton Johnnavartangula"
var fenry = new Thing("Fenry", "Honda");
elton.speak(); // <- "My name is Fenry Honda"
在实例化对象之间共享私有部分是另一个主题,可以通过几种方式完成,例如我之前的答案之一
function Source(){
var priv = "secret";
return {gp : function(){return priv},
sp : function(v){priv = v}
}
}
sharedProto = Source(); // priv is now under closure to be shared
var p1 = Object.create(sharedProto); // sharedProto becomes o1.__proto__
var p2 = Object.create(sharedProto); // sharedProto becomes o2.__proto__
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.