[英]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 === Object
是true
obj2.constructor === someConstructor
為true
吊裝:
someConstructor
被提升到它創建的范圍的頂部。 所以它可以在函數聲明之前使用。 somePrototype
不會與對象文字一起提升,因此應在設置值后使用。 查看有關constructor
屬性的這篇有趣帖子 。
Object.create()
調用創建一個對象並為其提供您請求的原型。 new
調用創建一個由該構造函數直接修飾的對象。
不同之處在於構造函數創建的對象具有自己的屬性,其值是使用console.log()
函數。 Object.create()
調用創建一個從原型對象繼承類似函數的對象。
如果將第一個對象傳遞給Object.keys()
,則不會看到“speak”屬性; 如果你傳遞了第二個對象,你會的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.