Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中创建新对象_Javascript_Javascript Objects - Fatal编程技术网

在JavaScript中创建新对象

在JavaScript中创建新对象,javascript,javascript-objects,Javascript,Javascript Objects,我是JavaScript中面向对象编程的新手,我不确定在JavaScript中定义和使用对象的“最佳”方式。我已经看到了定义对象和实例化新实例的“规范”方法,如下所示 function myObjectType(property1, propterty2) { this.property1 = property1, this.property2 = property2 } // now create a new instance var myNewvariable = new m

我是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"
});
我喜欢第二种方式——代码是自我记录的。但我的问题是:

  • 哪条路“更好”

  • 我可以用第二种方法来 实例化对象的变量 已使用 “经典”的定义方法 具有该隐式 建造师

  • 如果我想创建一个数组 这些东西,还有别的吗 考虑因素


  • 提前感谢。

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

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

    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"
    
    });  
    
    想一想,为了处理第一个方法提供给对象的属性,您必须处理多少个重载组合(或跟踪
    null
    s)。这是一种更具扩展性和灵活性的方法

    2) 只要允许它使用一个空的构造函数,这将使实例化更干净


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

    这完全取决于你的品味。这样:

    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')

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

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

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

    不过,我并不建议仅仅为了风格而使用第三方API

    如果我想创建这些对象的数组,还有其他考虑吗


    阵列有多大?这个数组的确切用途是什么?性能可能值得考虑…

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


    第52页,共页,我强烈推荐:-)

    几天前有一条关于这方面的好线索。按照惯例,建议将“object”函数的第一个字母大写<代码>新函数(){…}完全错误!使用factory/builder函数很好,但是
    新函数…
    是非常错误的。@SeanMcMillan说它是错误的,只有当你带参数时才有用:)@GôTô:公平
    newfunction(){…}
    将创建一个从匿名函数原型派生的新对象,并使用匿名函数对其进行初始化。您最终实例化了一个不需要的对象。老实说,我觉得这是个打字错误。无论哪种方式,
    obj.testing
    都将是一个对象,而不是一个函数,警报将在创建时运行,而不是作为方法运行。实例化一个
    new
    匿名函数与仅仅分配一个新对象(
    {}
    )是完全多余的。@SeanMcMillan顺便说一句,我知道它被弃用了,不知道为什么。谢谢
    var _constructor = SomeConstructorFunction;
    
    SomeConstructorFunction = function(hash) {
        return new _constructor(hash.property1, hash.property2);
    };
    
    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;
    };