繁体   English   中英

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

[英]Two ways of constructing an object in Javascript

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调用让语言知道它构造一个新对象,它本质上只是构造一个对象,其中'this'指的是正在创建的新对象??

就像这样做。

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

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

Person(12,"mark")

代替

new Person(12,"mark")

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

第一个:

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

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

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


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

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

JavaScript构造函数与工厂函数

Javascript对象创建模式

为JavaScript的构造函数辩护

构造函数vs工厂函数

工厂构造模式

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

构造函数对JavaScript不好

建设者与工厂

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM