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

时间:2015-02-15 17:45:15

标签: javascript

如何让sku保密,但允许getter访问它:

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

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

module.exports = {Product: Product};

4 个答案:

答案 0 :(得分:5)

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

Crockfords fairly old article获取私有成员变量的主题,您可以创建一个可以访问私有变量的方法,但是没有对私有变量的其他外部访问(例如,它不能从私有变量设置外):

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

var p = new Product(1234);
console.log(p.getSku());

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

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

因此,如果在构造函数中定义对象的某些方法,那么这些方法只有那些方法才能访问这些局部变量。因此,它们本质上是私有成员变量,因为它们是私有的和每个实例。这是Javascript闭包的概念,使其成功。

这适用于所有浏览器版本。


或者,如果您希望sku像只读属性一样工作,您可以使用属性语法而不是方法语法来读取它的值,则可以使用{{只为它定义getter 1}}在构造函数中像这样:

Object.defineProperty()

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

答案 1 :(得分:2)

使用Object.definePropertiesObject.defineProperty

var Product = function (sku) {

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

module.exports = {Product: Product};

对于node.js,您也可以使用__defineGetter__(但在ES规范中不推荐使用此方法):

var Product = function (sku) {

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

module.exports = {Product: Product};

答案 2 :(得分:0)

var Foo = (function(){

  var a_ = 0;

  function ret(v) {
    if (v) a_ = v;
    return ret;
  }

  // getter and setter for a_
  ret.a = function(v) {
    if (v) a_ = v;
    return a_;
  };

  return ret;

})();

var foo = Foo();
console.log(foo.a());
foo.a(33);
console.log(foo.a());

var bar = Foo(100);
console.log(bar.a());

答案 3 :(得分:0)

在原型上使用Object.defineProperties

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;