javascript - 在 Object.create() 中定义函数

标签 javascript design-patterns

我只想使用 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:trueobjA.a因为“一个属性不能既有访问器又是可写的或有值的”。这意味着如果你想改变 getter 的方法,你必须重新定义属性,而对于 value 你可以启用 = 的使用。更改与属性关联的方法。

此外,没有二传手objA.a = <expr>根本不会执行任何操作。

通常,您只会在以下情况下使用 getter 和 setter,使用 value否则作为标准行为;

  • 轻量级计算输出
  • 验证输入(保护对象)
  • 隐藏变量以防止直接访问
  • 保持变量或属性名称可能更改的标准 API

关于javascript - 在 Object.create() 中定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13715728/

相关文章:

Java分布式任务

c# - 简化 C# 中的组合接口(interface)

c++ - 关于可能的设计模式的问题

design-patterns - 您最喜欢的 GWT MVP 框架是什么?

javascript - Google Sheets Javascript - 计算连续负数

javascript - 除了拼写错误之外,注入(inject)代码时还会有其他什么原因导致语法错误吗?

javascript - 尝试使用express-load和express 4

asp.net-mvc - 在这种模式中,业务逻辑应该在哪里?

javascript - 设置 AudioContext 输入

javascript - Stack Overflow JavaScript 代码编辑器 : Members of Global Object 'window' Accessible Directly