Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
私有属性/公共getter-javascript_Javascript - Fatal编程技术网

私有属性/公共getter-javascript

私有属性/公共getter-javascript,javascript,Javascript,如何使sku私有化,但允许getter访问它: var Product = function (sku) { this.sku = sku; }; Product.prototype.getSku = function() { return this.sku; } module.exports = {Product: Product}; 由于您同时提到“private”和“getter”,所以并不完全清楚您想要什么。如果您希望外部世界可以获取值,但无法直接设置值,那么有两种

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

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

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

module.exports = {Product: Product};
由于您同时提到“private”和“getter”,所以并不完全清楚您想要什么。如果您希望外部世界可以获取值,但无法直接设置值,那么有两种方法可以做到这一点:

从私有成员变量的主题开始,您可以创建一个可以访问私有变量的方法,但是没有其他外部访问私有变量的方法(例如,不能从外部设置):

变量本身是私有的,不能从外部设置。但是它的值可以通过
getSku
方法检索

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

因此,如果您在构造函数中对对象定义了一些方法,那么这些方法以及只有这些方法才能访问这些局部变量。因此,它们本质上是私有成员变量,因为它们是私有的并且是每个实例的。正是Javascript闭包的概念使这一点得以实现

这适用于所有浏览器版本


或者,如果希望
sku
像只读属性一样工作,可以使用属性语法而不是方法语法读取其值,则可以在构造函数中使用
Object.defineProperty()
为其定义一个
getter
,如下所示:

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);
p.S.
Object.defineProperty()
需要IE9或更高版本。

使用或:

对于node.js,您也可以使用(但此方法在ES规范中已被弃用):


在原型上使用
对象。定义属性

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

Object.defineProperties(Product.prototype, {
  "sku": {
    get: function () { return this._sku; },
    set: function () { throw new Error("cannot set sku"); }
  }
});

module.exports = Product;

您不需要添加
可写:false、可配置:false等。默认情况下,它们是
false
。@alexpods-Yes。这样做是为了说明本答案的特点。我会说得更清楚一些。除了浏览器支持外,是否有任何偏好应该使用哪种方法?@MartyWallace-这两种方法之间的选择主要是您是否希望通过
p.getSku()
p.sku
访问它。这是您的设计选择。我更喜欢
p.sku
我自己,但您的文档需要明确说明您不能设置该属性。@jfriend00好吧。我重新开始了这个问题,因为OP没有明确要求只通过原型方法解决这个问题,这就是dup问题。
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);
var Product = function (sku) {

    Object.defineProperty(this, 'sku', {
        get: function() { return sku }
    })
};

module.exports = {Product: Product};
var Product = function (sku) {

    this.__defineGetter__('sku', function() {
        return sku;
    });
};

module.exports = {Product: Product};
var Product = function (sku) {
  this._sku = sku;
};

Object.defineProperties(Product.prototype, {
  "sku": {
    get: function () { return this._sku; },
    set: function () { throw new Error("cannot set sku"); }
  }
});

module.exports = Product;