【问题标题】:Creating New Objects in JavaScript在 JavaScript 中创建新对象
【发布时间】:2011-02-08 20:17:13
【问题描述】:

我是 JavaScript 中面向对象编程的新手,我不确定在 JavaScript 中定义和使用对象的“最佳”方式。我已经看到了定义对象和实例化新实例的“规范”方式,如下所示。

function myObjectType(property1, propterty2) {
    this.property1 = property1,
    this.property2 = property2
}
// now create a new instance
var myNewvariable = new myObjectType('value for property1', 'value for property2');

但我已经看到了以这种方式创建新对象实例的其他方法:

var anotherVariable = new someObjectType({
    property1:    "Some value for this named property",
    property2:    "This is the value for property 2"
});

我喜欢第二种方式的出现方式——代码是自我记录的。但我的问题是:

  1. 哪种方式“更好”?

  2. 我可以用第二种方法吗? 实例化对象的变量 已使用定义的类型 “经典”的定义方式 具有隐式的对象类型 构造函数?

  3. 如果我想创建一个数组 这些物体,还有其他的吗 考虑因素?

提前致谢。

【问题讨论】:

标签: javascript javascript-objects


【解决方案1】:

味道真的很差。这样:

var anotherVariable = new someObjectType({
    property1:    "Some value for this named property",
    property2:    "This is the value for property 2"
});

... 如果参数超过 2/3,通常会更好,因为它有助于提高可读性并更容易避免可选参数问题 (fn(null,null,null,123'))。

另一个考虑因素是性能。以传统方式传递参数会更快,但这种速度增益只有在对性能非常敏感的情况下才会显着。

我可以使用第二种方法来实例化一个对象类型的变量吗?该对象类型是使用隐式构造函数定义对象类型的“经典”方式定义的?

不容易。如果您想通过使用哈希而不是仅传递参数来实例化构造函数,并且您无法控制源,那么您可以“包装”它:

var _constructor = SomeConstructorFunction;

SomeConstructorFunction = function(hash) {
    return new _constructor(hash.property1, hash.property2);
};

不过,我真的不建议为了风格而使用第三方 API。

如果我想创建一个由这些对象组成的数组,还有其他注意事项吗?

数组有多大?数组到底是干什么用的?性能可能值得考虑...

【讨论】:

    【解决方案2】:

    创建 javascript 对象的最佳方法是使用 new 退出(至少如果您订阅了 crockford 阵营)

    myObjectType = function(props) {
      // anything defined on props will be private due to the closure
    
      props.privateVar = "private";
    
      // anything defined on obj will be public
      obj = {};
    
      obj.testing = new function() {
        alert(props.privateVar);
      };
    
      return obj;
    };
    instance = myObjectType({prop1: "prop"});
    
    // if we want inheritance, it just means starting with the base type instead of
    // a new object
    subType = function(props) {
      obj = myObjectType(props);
      obj.subTypeProperty = "hello.";
    
      return obj;
    };
    

    Javascript: The Good Parts 的第 52 页,我强烈推荐它:-)

    【讨论】:

    • 啊! new function(){...} 完全错误!使用工厂/构建器功能很好,但new function... 是非常错误的。
    • @SeanMcMillan 说这是错误的只有当你提出论据时才有帮助:)
    • @GôTô:公平。 new function(){...} 将创建一个从匿名函数原型派生的新对象,并使用匿名函数对其进行初始化。您最终会实例化一个不需要的对象。老实说,这对我来说看起来像是一个错字。无论哪种方式,obj.testing 将是一个对象,而不是一个函数,并且警报将在创建时运行,而不是作为一种方法。实例化 new 匿名函数是完全多余的,只需分配一个新对象 ({})。
    • @SeanMcMillan 顺便说一句,我知道它已被弃用,不知道为什么。谢谢!
    【解决方案3】:

    1) 我会说方法#2 是更受欢迎的,无论如何对我来说。具有 2 个属性的示例并没有什么不同,但是如果您想这样做:

    var anotherVariable = new someObjectType({
        property1:    "Some value for this named property",
        property2:    "This is the value for property 2"
        //Leaving several properties out, don't want them populated
        property8:    "This is the value for property 8"
        property9:    "This is the value for property 9"
    
    });  
    

    想想你必须处理多少个重载组合(或跟踪nulls)来处理你可能想或不想用第一种方法提供给对象的属性。这是一种更加更具可扩展性和灵活性的方法。

    2) 只允许它使用空白构造函数,这对于实例化会更清晰。

    3) 长度/可读性,尤其是在多个对象的情况下。看看 JSON,它非常干净/可读,至少对我来说,如果你喜欢这种风格,创建对象数组看起来非常类似于方法 #2。

    【讨论】:

      【解决方案4】:

      嗯,第二种方法看起来不错,并且在具有大量设置选项的“类”的情况下很有用。但是,请注意,您实际上是在此过程中构造另一个对象。

      我建议你从一个或另一个 Javascript 框架中阅读一些代码,然后找到一种吸引你的风格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-09
        • 1970-01-01
        • 2011-03-13
        • 2020-11-18
        • 2015-09-24
        • 2018-09-30
        • 2015-10-06
        • 1970-01-01
        相关资源
        最近更新 更多