私人财产/公共吸气剂 - JavaScript

Mar*_*ace 2 javascript

我如何使sku私有但允许getter访问它:

var Product = function (sku) {
    this.sku = sku;
};

Product.prototype.getSku = function() {
    return this.sku;
}

module.exports = {Product: Product};
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 5

既然你提到"私人"和"吸气",那么你想要的并不完全清楚.如果你想要的是外界可以获得价值,但不能直接设置价值,那么有几种方法可以做到:

Crockfords关于私有成员变量主题的相当古老的文章中,您可以创建一个可以访问私有变量的方法,但是没有对私有变量的其他外部访问(例如,它不能从外部设置):

function Product(sku) {
    this.getSku = function() {
        return sku;
    }
}

var p = new Product(1234);
console.log(p.getSku());
Run Code Online (Sandbox Code Playgroud)

变量本身是私有的,不能从外部设置.但是可以使用该getSku方法检索它的值.

这个想法是构造函数本地的任何变量(包括参数)只能由构造函数本身和构造函数中定义的任何函数访问,但外部世界无法访问.

因此,如果在构造函数中定义对象的某些方法,那么这些方法只有那些方法才能访问这些局部变量.因此,它们本质上是私有成员变量,因为它们是私有的和每个实例.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);
Run Code Online (Sandbox Code Playgroud)

PS Object.defineProperty()需要IE9或更高版本.