簡體   English   中英

JavaScript:構造函數與原型

[英]JavaScript: Constructor vs Prototype

這已經得到了回答,但我想證實我的理解。 在這段代碼中:

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)將返回[] ,因為該對象沒有自己的屬性。
  • obj2包含自己的屬性speak 在單個實例上修改此屬性不會影響使用new someConstructor()創建的任何其他實例。
    Object.keys(obj2)將返回['speak']作為其列出的屬性。

構造函數:

  • obj1.constructor === Objecttrue
  • obj2.constructor === someConstructortrue

吊裝:

  • someConstructor被提升到它創建的范圍的頂部。 所以它可以在函數聲明之前使用。
  • 並確保somePrototype不會與對象文字一起提升,因此應在設置值后使用。

查看有關constructor屬性的這篇有趣帖子

Object.create()調用創建一個對象並為其提供您請求的原型。 new調用創建一個由該構造函數直接修飾的對象。

不同之處在於構造函數創建的對象具有自己的屬性,其值是使用console.log()函數。 Object.create()調用創建一個從原型對象繼承類似函數的對象。

如果將第一個對象傳遞給Object.keys() ,則不會看到“speak”屬性; 如果你傳遞了第二個對象,你會的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM