簡體   English   中英

構造函數原型可枚舉?

[英]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.

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