Javascript 创建类的不同实例

Javascript 创建类的不同实例,javascript,Javascript,目前我正在声明JS类,如下例所示: function X(a) { this.x = a; X.prototype.do = function () { console.log(x); } } 我想删除'this'关键字,因此现在我的类在本例中如下所示: function X(a) { var x = a; X.prototype.do = function () { console.log(x); } } 当我

目前我正在声明JS类,如下例所示:

function X(a) {
    this.x = a;
    X.prototype.do = function () {
        console.log(x);
    }
}
我想删除'this'关键字,因此现在我的类在本例中如下所示:

function X(a) {
    var x = a;
    X.prototype.do = function () {
        console.log(x);
    }
}
当我有一个X类的实例时,这非常有效。当我尝试创建多个实例时,我会看到下一个问题:

var x1 = new X(1); 
x1.do();    // prints 1
var x2 = new X(2);
x2.do();    // prints 2
x1.do();    // prints 2 instead of 1
这个问题使我无法创建同一类的多个实例。
有人知道为什么会出现这个问题以及如何避免它吗?

您正在重新定义该方法的
原型实现,这意味着您正在为类的每个实例重新定义它。由于该方法返回一个闭合覆盖值,因此它对类的每个实例都返回相同的值

将其写为:

function X(a) {
    this.x = a;
}

X.prototype.do = function () {
    console.log(this.x);
}
或:


不是两者的奇怪组合。

在第一个示例中,
x
没有声明。永远不要在构造器中改变原型。太好了!第二个选择是我想要的。我将在8分钟内接受答案:)请注意,在构造函数中的每个对象上重新定义方法通常不是一个好主意。您应该使用第一种方法。我不知道你为什么这么想“摆脱这个”
,我需要将这个类中的变量设置为私有。你有没有什么建议,如何在不重新定义方法的情况下做到这一点?我在这个问题上的立场是,“私有”财产被高估了。如果您想发出“不要碰这个”的信号,请建立一个命名约定,如
\ux
。没有必要为这样的事情向后弯腰,这纯粹是程序员大会的问题。我会考虑的。不管怎样,谢谢你快速而有用的回答!
function X(a) {
    this.do = function () {
        console.log(a);
    };
}