目前,我正在为我的学校开展一个项目,其目的是创建一个与数学有关的对象;我的对象类似于Native Math
对象的对象,因此,我想模仿它的某些方面。
在Firefox中使用控制台时,我发现无法编辑某些属性(例如E
,PI
和SQRT2
)(通过稍微锁定来表示)。我知道有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
?
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);
}
答案 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
,但为了方便起见,将其保留是有用的(特别是如果你是这种技术的新手。)