JavaScript:构造函数与原型

JavaScript: Constructor vs Prototype

本文关键字:原型 构造函数 JavaScript      更新时间:2024-03-13

这个问题以前已经回答过了,但我想确认一下我的理解。在此代码中:

var somePrototype = {
  speak: function() {
    console.log("I was made with a prototype");
  }
}
function someConstructor() {
  this.speak = function() {
    console.log("I was made with a constructor");
  }
}
var obj1 = Object.create(somePrototype);
var obj2 = new someConstructor();
obj1.speak();
obj2.speak();

他们从根本上都在做同样的事情,对吗?唯一的区别是function someConstructor()是挂起的,这意味着如果需要,我可以在定义它之前调用它的新实例,而var somePrototype只能在定义它之后调用。除此之外,没有什么区别吗?

两种方法(使用Object.create()和构造函数调用)之间的区别是:

创建:

  • Object.create(somePrototype)创建了一个新的对象,使somePrototype成为它的原型
  • new someConstructor()使用构造函数调用创建一个对象。obj2的原型是一个简单的对象:new Object()

属性继承:

  • obj1继承属性speak,该属性是一个函数。如果somePrototype对象中的此属性发生更改,则会影响使用Object.create(somePrototype)创建的继承该属性的任何对象。
    Object.keys(obj1)将返回[],因为对象没有自己的属性
  • CCD_ 15包含自己的属性CCD_。在单个实例上修改此属性不会影响使用new someConstructor()创建的任何其他实例
    Object.keys(obj2)将返回['speak']作为其列出的属性

构造函数:

  • obj1.constructor === Object就是true
  • obj2.constructor === someConstructor就是true

吊装:

  • someConstructor被提升到它创建的作用域的顶部。因此,它可以在函数声明之前使用
  • 并且确保somePrototype没有与对象文字一起被提升,因此应该在设置值之后使用

查看这篇关于constructor属性的有趣文章。

Object.create()调用创建一个对象,并为其提供您请求的原型。new调用创建一个直接由该构造函数修饰的对象。

不同的是,构造函数创建的对象有一个自己的属性,其值是console.log()的函数。Object.create()调用创建一个对象,从原型对象继承类似的函数

如果将第一个对象传递给Object.keys(),则不会看到"speak"属性;如果你通过了第二个物体,你会的。