我只想使用 Object.create
函数创建一个对象(没有任何原型(prototype),第一个参数为 null)。
我在某处读到,属性决定了 JavaScript 中对象的状态,而 JavaScript 具有三种不同类型的属性:
- 命名数据属性
- 命名访问器属性
- 内部属性
所以当我在一个对象中定义一个函数时,我是否应该始终将它定义为一个命名访问器属性
:
var obj = Object.create(null, {
a:{
get:function(){
alert('jQuery nyan!');
}
}
});
或者当函数既不是setter
也不是getter
时,我是否应该将函数定义为命名数据属性
? [例如,一些对 DOM obj 进行更改的 jQuery 函数]
var obj = Object.create(null, {
a:{
value:function(){
alert('jQuery nyan!');
}
}
});
我应该采用哪种方法?在性能(速度)和内存管理方面它们有区别吗?他们似乎都毫无异常(exception)地工作。
obj.a;
//output: 'jQuery nyan!'
最佳答案
为了方便引用,我们定义如下
var objA = Object.create(null, {a: {get: function(){alert('jQuery nyan!');}}});
var objB = Object.create(null, {a: {value:function(){alert('jQuery nyan!');}}});
现在,objA.a
的调用几乎没有区别了。对比objB.a()
, 除了使用 ()
.
但是,还是有一些不同。
主要区别在于您不能将参数传递给 getter,它按原样调用。这意味着 objA.a(1,2,3)
不会调用带有参数的函数 1, 2, 3
.它实际上会在 调用后抛出一个错误,假设 getter 没有返回一个 Function (你实际上是在尝试做 undefined(1,2,3)
)。
第二个区别需要我们记住 Object.create
的第二个参数采用 descriptors 的对象,其中包括标志 writable
(默认为 false)。这里的区别是你不能设置 writable:true
在 objA.a
因为“一个属性不能既有访问器又是可写的或有值的”。这意味着如果你想改变 getter 的方法,你必须重新定义属性,而对于 value 你可以启用 =
的使用。更改与属性关联的方法。
此外,没有二传手objA.a = <expr>
根本不会执行任何操作。
通常,您只会在以下情况下使用 getter 和 setter,使用 value
否则作为标准行为;
- 轻量级计算输出
- 验证输入(保护对象)
- 隐藏变量以防止直接访问
- 保持变量或属性名称可能更改的标准 API
关于javascript - 在 Object.create() 中定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13715728/