7

我是 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. 如果我想创建这些对象的数组,还有其他注意事项吗?

提前致谢。

4

4 回答 4

7

实在是太难吃了。这边走:

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。

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

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

于 2010-04-16T13:49:16.583 回答
3

创建 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 页,我强烈推荐它 :-)

于 2010-04-16T14:04:32.527 回答
2

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 中创建对象数组看起来非常相似。

于 2010-04-16T13:48:59.250 回答
1

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

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

于 2010-04-16T13:44:36.000 回答