9

假设您正在创建数据类型并公开其行为。

你能举一些你什么时候使用的例子:

  • 一个功能和新的:

    // define new data type
    var CustomDataType= function(){ 
                          this.a='whatever';
                          this.doX= function(){/*some code*/};
                        }
    
    // create a new instance of our custom data type
    var obj= new customDataType();
    
  • 对象文字和 Object.create:

    // define new data type
    var customDataType = {
                           a: 'whatever',
                           doX: function(){/*some code*/}
                         }
    
    // create a new instance of our custom data type
    var obj= Object.create(customDataType);
    
  • 构建对象的函数:

    function customDataTypeFactory(options){
      return {
               a: 'whatever',
               doX: function(){/*some code*/}
             }
    };
    
    // create a new instance of our custom data type
    var obj= customDataTypeFactory(options);
    

我觉得这可以被标记为重复:newvs Object.create,但我的主要兴趣不是讨论哪个更好,而是要知道是否有特定的用例应该优先于其他用例。

我已经阅读了许多有关相关问题的帖子和 Crockford 的书:Javascript:好的部分。到目前为止,我已经得出结论,这是一个偏好问题,强硬的 Crockford 的建议对我产生了很大的共鸣:“尽量避免危险和不必要的功能”......我说的是new.

4

1 回答 1

8

我将从我通常定义类的方式开始:

function CustomDataType(a)
{
  this.a = a;
  this.b = 2;
}
CustomDataType.prototype = {
  doX : function () {}
};
var obj = new CustomDataType(1);

我在构造函数中分配变量是因为F.prototype = { a : [1,2,3]; }存在问题,除非在构造函数中重新初始化属性(对于所有非原始类型都有问题),否则数组将在实例之间共享。当属性以某种方式依赖于构造函数的参数时,也需要它。我在原型中声明了方法,以便它们在所有实例之间共享,如果您使用继承,则意味着您可以进行超级调用,这也会导致更少的内存使用,因为该方法只需分配一次(尽管这可能不是一个大问题)。

我从来没有使用过Object.create,除非你喜欢一些疯狂的动态黑客,否则我认为没有任何理由这样做。

每当感觉没有必要为对象创建单独的类时,我都会使用对象文字,例如,如果它是方法的参数(因此调用者不必显式实例化某些东西),或者如果它是一些不应访问的内部值由其他任何人。

您的工厂本质上与对象文字相同。我想如果您需要创建一些 jsonesque 结构并设置一些默认值,它会很有用。

我不明白为什么new会是危险的或不必要的,他是在什么情况下这么说的?

但我认为很多都归结为品味。保持一致,不要使事情复杂化。

于 2013-04-07T05:47:41.883 回答