【问题标题】:Clarifying Javascript Object.defineProperties usage阐明 Javascript Object.defineProperties 的用法
【发布时间】:2014-02-19 16:24:45
【问题描述】:

我仍然不觉得我完全理解 Object.defineProperties 的使用,所以我希望能对以下(有些人为的)示例提供一些意见:


1。在以下代码中,my_valonetwo 的行为相同:

var Class_1 = function (arg) {
    this.my_val = arg;
};

var Class_2 = function (arg) {
    Object.defineProperties(this,{
        my_val : {
            value : arg,
            writable : true,
            enumerable : true,
            configurable : true
        }
    });
};

var one = new Class_1("foo");
var two = new Class_2("foo");

使用defineProperties 而不是像在Class_1 中那样分配它的原因是,当您希望writableenumerableconfigurable 为假时;基本上是为了控制。否则简单的this.property 定义是相同的,对吗?


2。在以下代码中,my_val 的行为与 threefour 相同:

var Class_value = function (arg) {
    Object.defineProperties(this, {
        my_val : {
            value : arg, 
            writable : true,
//          enumerable : false   // default
//          configurable : false // default
        }
    });
};

var Class_getSet = function (arg) {
    Object.defineProperties(this, {
        __my_val : {
            value : arg,
            writable : true,
//          enumerable : false   // default
//          configurable : false // default
        },
        my_val : {
            get : function(){ return this.__my_val; }, 
            set : function(new_val){ this.__my_val = new_val; }
        }
    });
};

var three = new Class_value("foo");
var four = new Class_getSet("foo");

而使用get/set 函数而不是value 的原因是当您想要添加更高级的逻辑时,例如在更新my_val 时调用另一个函数,或发送事件等。此外,您不能使用 get/set 而不至少定义初始值(通过此处显示的 value 属性,或通过 1. 中的简单 this.property = ... 定义),对吗?


基本上,我只是想确保自己了解如何以及何时使用 defineProperties 的原因,因为我觉得我还没有很好地掌握这个概念。

【问题讨论】:

    标签: javascript object properties


    【解决方案1】:

    my_val 对于一和二的行为相同

    是的。

    my_val 对于三个和四个的行为相同

    不-有__my_val。您至少可以考虑使用局部范围的“私有”变量而不是公共属性。

    使用 get/set 函数而不是 value 的原因是当您想要添加更高级的逻辑时,例如在 my_val 更新时调用另一个函数,或发送事件等。

    是的,这就是 getters/setters 的用途。

    此外,如果不定义初始值(通过此处显示的 value 属性,或通过 1 中的简单 this.property = ... 定义),您也不能使用 get/set,对吗?

    不,您也可以直接留下undefined

    【讨论】:

    • 啊,好吧,我对简单的私有变量忘记了属性。所以在 2. 的情况下,我可以改为这样:gist.github.com/CarnotInteractive/47bd2de33c88125299a8 对于任何使用threefour 的人来说,它的行为都是一样的,对吗?
    • 是的,应该表现出相同的行为。
    猜你喜欢
    • 2013-06-11
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多