当我有自定义构造函数时,我尝试在 JavaScript 中应用模块模式。让我们举个例子:
// Assume I need `name` as private
function Dog(name){
this.name = name;
}
我可以将上面重写为:
function Dog(name) {
let dogName = name;
return {
getName : function () {
return dogName;
},
setName : function (name) {
dogName = name;
}
}
}
上面的代码没有正确的constructor
属性和Dog.prototype
,并且返回的对象的原型(prototype)
不匹配.
为了解决这个问题,我做了 2 个修复:
function Dog(name) {
let dogName = name;
return {
// Fix 1
constructor : Dog,
getName : function () {
return dogName;
},
setName : function (name) {
dogName = name;
}
}
}
let d2 = new Dog("Tony");
// Fix 2 : This is painful as every time I need to set this up
Object.setPrototypeOf(d2 , Dog.prototype);
如您所见,修复 2 很痛苦。每次我必须创建一个对象时,我都需要这样做。 还有更好的办法吗?
让我们不要偏离我们的讨论,即 getter 和 setter 应该移至原型(prototype)。以上只是我正在使用的一个简单示例。
最佳答案
这里的问题是您在“构造函数”中返回一个对象文字,对象文字具有 Object
原型(prototype)。您不应该在构造函数中返回,您应该像在第一个代码片段中那样将内容分配给 this
。
function Dog(name) {
let dogName = name;
this.getName = function () {
return dogName;
};
this.setName = function (name) {
dogName = name;
};
}
但这不是实现类的常见模式,您甚至没有使用原型(prototype)
,因此不清楚为什么原型(prototype)
对您很重要。显然,这种方法允许您关闭变量以使其成为“私有(private)”变量,而使用原型(prototype)是不可能的。然而,这种方法的开销更大,因为 Dog
的每个实例都将拥有自己的 getName
和 setName
函数,这是“私有(private)”的标准约定变量和方法的方法是用下划线作为前缀,以便您可以按预期使用原型(prototype)
。
function Dog(name) {
this._name = name;
}
Dog.prototype.getName = function () {
return this._name;
};
Dog.prototype.setName = function (name) {
this._name = name;
};
关于javascript - JavaScript 中用于自定义构造函数的模块模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60422763/