关于如何在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获得以下输出:
我读到ES6
类只是语法糖,它们与构造函数基本相同(在我的例子中创建对象的第二种方式)
对我来说,这些方法看起来都一样,因为它们都创建了具有的对象
0bject为__proto__
属性。除了使用new
关键字创建的对象的命名方式不同之外,这些对象是否有任何差异?例如,以不同方式创建对象的性能是否存在差异?
答案 0 :(得分:3)
类构造函数比函数构造函数做的更多。
class意味着在正常函数之上是声明性的,安全层,限制您仅使用函数来使用new
实例化对象并通过原型继承(通过原型) extends
和super
个关键字。
常规函数几乎可以完成类的所有操作,除非是以更详细的方式且没有限制。这样可以提高灵活性,但也增加了漏洞的可能性。
还有一些其他值得注意的差异:
new B() // <-- this is fine cause B is hoisted
function B(){}
new A() // <-- doesn't exist cause A's not hoisted
class A{}
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个对象实际上是相同的。