如何将对象及其子对象声明为常量?

时间:2014-11-29 00:13:27

标签: javascript const

目前,我正在为我的学校开展一个项目,其目的是创建一个与数学有关的对象;我的对象类似于Native Math对象的对象,因此,我想模仿它的某些方面。

在Firefox中使用控制台时,我发现无法编辑某些属性(例如EPISQRT2)(通过稍微锁定来表示)。我知道有const声明方法,但我已经尝试了两种方法......

const obj = {
    prop: function(x){
        return x^3^4;
    },
    foo: "bar",
    bar: "foo"
}
obj.prop = -3.14;
print(obj.prop);    // prints "-3.14"

...和...

const unEditable = 2.718;
var obj = {e:unEditable};
obj.e = 3;
print(obj.e);    // prints "3"

有没有办法定义对象的属性,以便用户无法编辑所述属性?我的意思是,我可以为obj变量e分配值2.718,以便当某人为obj.e赋值"Hello, world!时,{{ 1}}仍会返回obj.e

注意:

Code Fragmant

2.718

结论

基于Wingblade答案的答案:

var Θ = {};
Θ.e = 2.71828;
Θ.pi = 3.14159;
Θ.fac = function(num){
    if(!arguments.length) return NaN;
    return (num<2)?(num<0)?Infinity:1:num*Θ.fac(num-1);
}
Θ.nroot = function(n,m){
    return Θ.pow(n,1/m);
}

1 个答案:

答案 0 :(得分:2)

您可以使用obj.defineProperty以更高级的方式向对象添加属性,从而更好地控制属性的行为方式,例如,如果它是可写的。

有关此内容的更多信息:MDN Object.defineProperty()

编辑:要一次定义多个属性,您可以使用Object.defineProperties(),如下所示:

var o = {};
Object.defineProperties(o, {
  "e": {
    value: 2.71828,
    writable: false
  },
  "pi": {
    value: 3.14159,
    writable: false
  },
  "fac": {
    value: function(num){
        if(!arguments.length) return;
        return (num<2)?(num<0)?Infinity:1:num*o.fac(num-1);
    },
    writable: false
  },
  "nroot": {
    value: function(n,m){
        return o.pow(n,1/m);
    },
    writable: false
  }
});

您实际上可以省略所有属性的writeable: false,因为在使用false添加属性时默认为Object.defineProperty,但为了方便起见,将其保留是有用的(特别是如果你是这种技术的新手。)