比较JS中创建对象的方法

时间:2018-02-10 21:33:15

标签: javascript oop ecmascript-6

关于如何在JS中创建对象的一些文献综述是我到目前为止所得到的:



// Using ES6 classes
class Animal1 {
  constructor(name) {
    this.name = name;
  }
}
let fluffy = new Animal1("fluffy");

// Using constructor functions
function Animal2(name) {
  this.name = name;
}
let puppy = new Animal2("puppy");

//  Using Object.create
function createBunny(name) {
  let bunnyObj = Object.create(Object.prototype);
  bunnyObj.name = name;
  return bunnyObj;
}
let bunny = createBunny("bunny");

// Using object literal
function createKitten(name) {
  let kittenObj = {
    name: name
  };
  return kittenObj;
}

let kitten = createKitten("kitten");

console.dir(fluffy);
console.dir(puppy);

console.dir(bunny);
console.dir(kitten);




console.dir获得以下输出:

javascript objects

我读到ES6类只是语法糖,它们与构造函数基本相同(在我的例子中创建对象的第二种方式)

对我来说,这些方法看起来都一样,因为它们都创建了具有的对象 0bject为__proto__属性。除了使用new关键字创建的对象的命名方式不同之外,这些对象是否有任何差异?例如,以不同方式创建对象的性能是否存在差异?

1 个答案:

答案 0 :(得分:3)

类构造函数比函数构造函数做的更多。

class意味着在正常函数之上是声明性的,安全层,限制您仅使用函数来使用new实例化对象并通过原型继承(通过原型) extendssuper个关键字。

常规函数几乎可以完成类的所有操作,除非是以更详细的方式且没有限制。这样可以提高灵活性,但也增加了漏洞的可能性。

还有一些其他值得注意的差异:

    函数声明时,
  • 类声明不会被挂起

new B() // <-- this is fine cause B is hoisted
function B(){}

new A() // <-- doesn't exist cause A's not hoisted
class A{}

  • 类主体(基本上是类中的所有代码)默认在strict mode
  • 中执行

class A {
  constructor() {
    b = 5; // assigning to a global is an error in strict mode
  }
}

c = 5 // <-- assigning to a global outside of a class is fine since no strict mode
new A()

  • 类有一些安全检查,例如,你不能像常规函数那样调用类(没有new):

class A {
  constructor(){}
}

A() // Uncaught TypeError: Class constructor A cannot be invoked without 'new'

所有这些额外的“语法糖”在课程之上,由于它做了一定量的工作,自然会导致一些理论上的性能损失。话虽这么说,但这并不重要,对99.99%的用法来说无关紧要。

关于类真正重要的是要理解它们只是比现有功能更漂亮的层,并且它们不会在JS中创建新的OOP系统。这只是(有点主观地)一种更好的语法。

Object.create和对象文字使我们可以轻松地动态实例化JS对象。与使用像Object.create这样的文字相反,{}所做的是,它实际上创建了一个新对象,其原型是您提供的对象。另一方面,仅使用{}对原型没有任何作用(默认情况下每个{}都有Object.prototype作为原型),只需创建一个对象实例。

这意味着您对Object.create(Object.prototype){}的使用实际上是等效的,前者是后者的更详细版本。

具体根据您的4个示例,创建的所有4个对象实际上是相同的。