我想使用Object.create
函数创建一个对象(没有任何原型,第一个参数为null )。
我在某处读到属性确定JavaScript中对象的状态,JavaScript有三种不同的属性:
因此,当我在对象中定义一个函数时,我是否应该始终将其定义为named accessor property
:
var obj = Object.create(null, {
a:{
get:function(){
alert('jQuery nyan!');
}
}
});
或者我应该将该函数定义为named data property
,当它既不是setter
也不是getter
时? [例如,一些改变DOM obj的jQuery函数]
var obj = Object.create(null, {
a:{
value:function(){
alert('jQuery nyan!');
}
}
});
我应该采取哪种方法?在性能(速度)和内存管理方面,它们有区别吗?它们似乎都没有任何例外。
obj.a;
//output: 'jQuery nyan!'
答案 0 :(得分:1)
为了更容易引用它们,让我们按如下方式定义它们
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)
不会使用arugments 1, 2, 3
调用该函数。实际上,在调用之后会抛出错误,假设getter没有返回 Function (你有效地尝试undefined(1,2,3)
)。
第二个区别要求我们记住Object.create
的第二个参数需要descriptors的对象,其中包含标记writable
(默认为 false )。这里的不同之处在于您无法在writable:true
上设置objA.a
,因为“属性不能同时具有访问权限且可写或具有值”。这意味着如果您希望更改getter的方法,则必须重新定义属性,而对于 value ,您可以启用=
来更改与该属性关联的方法
此外,没有setter objA.a = <expr>
根本不会执行任何操作。
通常情况下,您只在以下情况下使用getter和setter,否则将value
作为标准行为;
答案 1 :(得分:1)
如果您不关心兼容性,使用getter
和setters
可能是替换setNAME()
和getNAME()
的好方法。还有no significant performance gain/loss comparing to function version。
请注意,因为它看起来像访问变量而不是调用函数,所以getter/setter
函数应该非常轻,以满足这种期望。
并且不要像jQuery那样对getter和setter使用一个函数,它只是非常慢。由于javascript中没有函数签名,因此使用if/else
进行模拟将导致大量性能损失。