如何将 sku 设为私有(private)但允许 getter 访问它:
var Product = function (sku) {
this.sku = sku;
};
Product.prototype.getSku = function() {
return this.sku;
}
module.exports = {Product: Product};
最佳答案
由于您同时提到了“私有(private)”和“ setter/getter ”,因此您并不完全清楚您想要什么。如果你希望外界可以获取到该值,但不能直接设置该值,那么有两种方法可以实现:
摘自 Crockfords fairly old article关于私有(private)成员变量的主题,您可以创建一个可以访问私有(private)变量的方法,但没有其他外部访问私有(private)变量的方法(例如,它不能从外部设置):
function Product(sku) {
this.getSku = function() {
return sku;
}
}
var p = new Product(1234);
console.log(p.getSku());
变量本身是私有(private)的,不能从外部设置。但可以使用 getSku
方法检索它的值。
这个想法是构造函数的任何局部变量(包括参数)只能由构造函数本身和构造函数中定义的任何函数访问,但外部世界无法访问。
因此,如果您在构造函数中为对象定义了一些方法,那么这些方法并且只有这些方法可以访问那些局部变量。因此,它们本质上是私有(private)成员变量,因为它们是私有(private)的并且是针对每个实例的。正是 Javascript 闭包的概念使这项工作成为可能。
这适用于所有浏览器版本。
或者,如果您希望 sku
像只读属性一样工作,您可以使用属性语法而不是方法语法读取它的值,您可以只定义一个 getter
在构造函数中使用 Object.defineProperty()
是这样的:
function Product(sku) {
Object.defineProperty(this, "sku", {
get: function() { return sku;},
writable: false, // default value, doesn't have to be specified
configurable: false, // default value, doesn't have to be specified
enumerable: false
});
}
var p = new Product(1234);
console.log(p.sku);
附言Object.defineProperty()
需要 IE9 或更高版本。
关于javascript - 私有(private)属性(property)/公共(public) setter/getter - javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28529060/