在Javascript中构造对象的两种方法

时间:2015-04-02 02:13:40

标签: javascript object constructor

function Person(age,name){
    this.name = name;
    this.age  = age;
    this.speak = function(){...}
}

function Person(age,name){
    var p = {}
    p.name = name;
    p.age = age;
    p.speak = function(){...}
    return p;
}

我看到的唯一区别是使用第一个你必须用new调用以让语言知道它构造一个新对象,它实际上只是构建一个对象,其中'这个'是指正在创建的新对象??

就像这样做。

{
   age: 12,
   name: "mark",
   speak: function(){...}
}

其中第二个返回一个对象,所以你可以写

Person(12,"mark")

而不是

new Person(12,"mark")

所以我想我的问题是,使用第二个版本是否有什么问题,我说的差异是正确的,它们是两者之间的唯一区别吗?

1 个答案:

答案 0 :(得分:9)

第一个:

function Person(age,name){
    this.name = name;
    this.age  = age;
    this.speak = function(){...}
}
  1. 是一个命名的构造函数。
  2. instanceof Person
  3. 一起正常运作
  4. 使用
  5. 更容易进行mixins或经典Javascript继承
  6. 如果有很多方法,可以将原型用于可能消耗更少内存的方法,或者更快地构建对象
  7. 也可以在不需要new的情况下工作。
  8. 更类似于新ES6 classextends语法的工作原理,这可能是将来编写大量Javascript的原因。

  9. 第二个:

    function Person(age,name){
        var p = {}
        p.name = name;
        p.age = age;
        p.speak = function(){...}
        return p;
    }
    
    1. 是工厂功能。它创建一个通用对象,为其分配属性,然后返回该对象。
    2. 它可以继承,但不能以经典的方式继承,只能由另一个知道该对象如何工作的工厂函数继承。 mixin的某些类型的继承与这种结构不同。
    3. 无法使用instanceof
    4. 不能也不能将原型用于方法。
    5. 可以使用new调用并且仍然有效(系统创建的新对象将被丢弃)。
    6. 可以创建任何类型的对象。它甚至可以根据传递的参数或环境进行分支,并根据某些逻辑创建不同类型的对象。从技术上讲,您也可以使用第一种样式执行此操作,但效率很低,因为解释器会创建特定类型的对象,然后您将返回其他内容,从而导致创建的原始对象随后被垃圾回收。所以,如果您要创建多种不同类型的对象,第二种方法会更有效率。
    7. 除了这些差异之外,这两者之间的功能基本相同,而且在技术上没有任何差异"错误"用这两种方法。

      Javascript中有两种编程风格的倡导者,有些人会说有一种情况比另一种情况更合适,反之亦然。我建议你为这个对象构建一些子类来清除一些编程差异,因为子类的工作方式也不同。


      如果你想搜索关于这个主题的其他文章,这基本上是一个"构造函数与Javascript"中的工厂函数。有时候会误入/反对使用.prototype,但也倾向于涵盖你的主题。

      以下是关于该特定主题的一些文章(涵盖了一系列意见):

      JavaScript Constructor Functions Vs Factory Functions

      Javascript object creation patterns

      In defense of JavaScript’s constructors

      Constructor function vs Factory functions

      Factory constructor pattern

      Some Useful JavaScript Object Creation Patterns

      Constructors Are Bad For JavaScript

      Constructors vs factories