JavaScript类表示法和';这';关键词
我知道在这个话题上还有一些其他的问题,但是没有一个能给出一个结论性的答案 我正在构建一个HTML/CSS/JS移动应用程序,并一直在尝试以下符号样式来定义一些类: 样式AJavaScript类表示法和';这';关键词,javascript,class,ecmascript-6,this,Javascript,Class,Ecmascript 6,This,我知道在这个话题上还有一些其他的问题,但是没有一个能给出一个结论性的答案 我正在构建一个HTML/CSS/JS移动应用程序,并一直在尝试以下符号样式来定义一些类: 样式A var Thing = (function () { var _instance; var _firstName; var _lastName; function Thing(firstName, lastName) { _instance = this;
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
- 我可以使用
变量,从而避免对\u实例
的标识产生歧义这个
- 该符号相当清晰易读
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
关键字相关的问题;也就是说,根据调用方的上下文,这个可以引用类方法中的不同内容。此外,在这两种情况下,不可能像我在A中那样使用\u实例变量,因为所有成员都需要以this作为前缀。
但是,正如注释中指出的,样式A在创建类的多个实例时不起作用
编写此类类但避免出现问题的最佳方法是什么?如果您想不惜一切代价避免使用后期绑定的this
的原型方法,可以在ES6中使用以下样式:
class Thing {
constructor(firstName, lastName) {
this.getMyName = () => firstName + " " + lastName;
this.speak = () => "My name is " + this.getMyName();
}
}
(您也可以使用函数
声明,但是类
的优点是它可以防止在没有新建
的情况下自动调用)您正在创建一个闭包,然后通过Thing
构造函数在实例化对象之间共享闭包。它将无法按预期工作
var elton = new Thing("Elton", "Johnnavartangula");
elton.getMyName(); // <- "Elton Johnnavartangula"
var fenry = new Thing("Fenry", "Honda");
elton.speak(); // <- "My name is Fenry Honda"
你的“A风格”根本不管用。您是否尝试过创建多个实例?此外,您从不初始化实例。样式A与其他样式不同。闭包中的这些变量对每个实例都是重复使用的。感谢@Bergi,我编辑了初始化\u instance
@elclanrs-这很好,但这意味着我现在没有解决方案,而只有一个。对我来说,听起来你试图解决错误的问题。您试图避免使用this
,而不是避免不正确地使用this
。但是在一个非平凡的情况下,如果一个类有许多大型方法,那么在构造函数中包含所有这些方法肯定会有点麻烦?(虽然我确实认识到箭头函数的“词法this”用法,但我一直试图将其合并到解决方案中,但没有成功)@Benp44:显然,这就是你想要的。如果没有此
,则无法使用原型方法。
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__