JavaScript类表示法和';这';关键词

JavaScript类表示法和';这';关键词,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;

我知道在这个话题上还有一些其他的问题,但是没有一个能给出一个结论性的答案

我正在构建一个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
    前缀)
  • 我可以使用
    \u实例
    变量,从而避免对
    这个
    的标识产生歧义
  • 该符号相当清晰易读
我还尝试了以下备选方案:

样式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());
    }
}
但是,尽管有它们的优点,我发现BC很难使用,因为与
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__