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

Kob*_*orl 6 javascript constructor object

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;
}
Run Code Online (Sandbox Code Playgroud)

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

就像这样做.

{
   age: 12,
   name: "mark",
   speak: function(){...}
}
Run Code Online (Sandbox Code Playgroud)

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

Person(12,"mark")
Run Code Online (Sandbox Code Playgroud)

代替

new Person(12,"mark")
Run Code Online (Sandbox Code Playgroud)

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

jfr*_*d00 9

第一个:

function Person(age,name){
    this.name = name;
    this.age  = age;
    this.speak = function(){...}
}
Run Code Online (Sandbox Code Playgroud)
  1. 是一个命名的构造函数.
  2. 能正常使用 instanceof Person
  3. 使用mixins或经典的Javascript继承更容易
  4. 如果有很多方法,可以将原型用于可能消耗更少内存的方法,或者更快地构造对象
  5. 也可以设计为无需工作new.
  6. 更类似于新的ES6 classextends语法如何工作,这可能是将来很多Javascript的写法.

第二个:

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

除了这些差异之外,两者的功能大致相同,并且在任何一种方法中技术上都没有"错误".

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


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

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

JavaScript构造函数与工厂函数

Javascript对象创建模式

为JavaScript的构造函数辩护

构造函数vs工厂函数

工厂构造模式

一些有用的JavaScript对象创建模式

构造函数对JavaScript不好

建设者与工厂