[英]Constructor functions prototype enumerable?
在閱讀了幾篇文章和文檔之后,我仍然不清楚可枚舉屬性的真正定義。 繼續前進,讓我告訴你我困惑的地方:
我創建一個構造函數並添加一個原型。
var myAlphabet = function() {
this.c = 5
this.d = 6
}
myAlphabet.prototype = {
e:7
}
現在我使用new關鍵字創建myAlphabet的新實例
var myObject = new myAlphabet();
使用for-in循環,我想在console.log中調用myObject實例中的所有鍵(而不是原型中的鍵)。
for( key in myObj){
console.log(key);
}
這個日志:
'c'
'd'
'e'
根據for..in循環文檔:
for..in語句以任意順序迭代對象的可枚舉屬性。 對於每個不同的屬性,可以執行語句。
這讓我相信原型是一個enumerable property
。 但是閱讀Enumerable properties
的文檔
屬性的所有權取決於屬性是直接屬於對象而不屬於其原型鏈。
因此,之前創建的原型不直接在myObject的實例上,它包含在原型鏈中。 當我遍歷每個鍵時,為什么包括這個?
當我遍歷每個鍵時,為什么包括這個?
它是通過設計javascript的對象原型是它們繼承值的方式
就像你上課一樣
class:base
{
c:2
d:3
}
base
{
a:1
}
如果你實例化了一個類型為myAlphabet的對象,它將具有屬性a,b and c
,不同之處在於,在具有類的語言中,實例將“包含”由其定義的所有值以及由父類定義的值。
instance of class
{
a:1//because my parent told me so
c:2
d:3
}
在原型語言中,對象派生自對象,這意味着值不會駐留在實例本身中,而是駐留在充當父對象的實例上
object1
{
prototype:object2//hidden from enumerator
c:2
d:3
...//when enumerating include all from prototype
}
object2
{
prototype:null//hidden from enumerator
a:1
...//when enumerating include all from prototype
}
所以你實際上保持繼承就像它與分類語言一樣工作,主要區別在於,繼承是在運行中進行的..如果你從子alert(object1.a)
讀取更改object2.a = new
,則值實際上駐留在原型對象中alert(object1.a)
它將從父new
獲取新的更新值
如果您需要知道枚舉屬性是否位於從父級獲取的對象本身中,則必須使用object1.hasOwnProperty(a)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.