如何从内部设置属性而不使用setter

时间:2015-09-05 08:31:16

标签: javascript

假设我有一个像这样设置的对象属性:

Object.defineProperty(this, "currentPath", {
    get: function () {
        // some logic here
        return this.currentPath.length === 0;
    }.bind(this),
    set: function(value) {
        // some logic here
        this.currentPath = value;
    }.bind(this)
});

在对象之外我希望每个人都使用getter和setter来访问currentPath属性,就像这个navigator.currentPath一样,但是在对象内部我想通过设置者来设置这个属性。我唯一的选择是有两个属性 - 一个是通过getter访问,另一个是内部设置?

1 个答案:

答案 0 :(得分:0)

另一种选择是将属性的实际值存储在对象的原型中(必须与对象本身一起创建),同时保持getter和setter将原型自己的属性暴露给外部。

var obj =
    Object.create(
        { currentPath: "" },
        {
            currentPath:
            {
                get: function () {
                    return this.__proto__.currentPath;
                },
                set: function (currentPath) {
                    this.__proto__.currentPath = currentPath;
                }
            }
        }
    );

此处obj.currentPath将调用getter或setter,而obj.__proto__.currentPath将直接访问value属性。

不是使用this.__proto__.currentPath在内部访问属性,而是可以根据需要更改调用上下文:

function logPath()
{
    console.log(this.currentPath);
}

this.logPath(); // use getter
logPath.call(this.__proto__); // don't use getter
// .bind is also an option...

当然,对象和原型都可以在代码中随处访问,但是根据用例,这可能是可接受的甚至是理想的行为(只需使用不需要getter / setter开销的原型)。