JavaScript:构造函数与原型

时间:2016-04-08 04:47:18

标签: javascript

之前已经回答过,但我想证实我的理解。在这段代码中:

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只能在定义之后调用。除此之外,没有区别吗?

2 个答案:

答案 0 :(得分:7)

两种方法(使用case和构造函数调用)之间的差异是:

创作:

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

属性继承:

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

构造函数:

  • Object.keys(obj2)['speak']
  • obj1.constructor === Objecttrue

<强>起重:

  • obj2.constructor === someConstructor被提升到创建范围的顶部。所以它可以在函数声明之前使用。
  • 并且确保true未与对象文字一起提升,因此应在设置值后使用。

检查this interesting post关于someConstructor属性。

答案 1 :(得分:6)

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

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

如果您将第一个对象传递给Object.keys(),您将无法看到&#34;说&#34;属性;如果你传递了第二个对象,你会的。