javascript - 私有(private)属性(property)/公共(public) setter/getter - javascript

标签 javascript

如何将 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/

相关文章:

javascript - 为什么 Express 句柄不抛出新错误?

javascript - 如何停止 html 属性中 onclick 事件的事件传播?

javascript - 索引数据库 "The operation failed because the requested database object could not be found. "

javascript - 如何扩展javascript对象?

javascript - AngularJS - 当数据插入数组时,ng-repeat 和绑定(bind)未更新

javascript - 在下拉列表 1 中选择某项后启用第二个下拉列表

php - 使用javascript获取 anchor 标记文本

javascript - 如何改进这段代码,转换字符串

javascript - Ajax JSON 响应到 HighCharts

javascript - Nativescript getViewById 未更新倒计时