2017-08-13 178 views
1

嗯,我一直在通過Mozilla開發者網絡(mdn)最近閱讀Javascript繼承模型。我是一個point.Here的代碼混淆高度從MDN:繼承和原型鏈

function Graph() { 
    this.vertices = []; 
    this.edges = []; 
} 
Graph.prototype = { 
    addVertex: function(v) { 
    this.vertices.push(v); 
} 
}; 
var g = new Graph(); 
console.log(g.hasOwnProperty('vertices'));// true 
console.log(g.hasOwnProperty('addVertex'));// false 
console.log(g.__proto__.hasOwnProperty('addVertex'));// true 

清楚我不明白的是,爲什麼g.hasOwnProperty(「addVertex」)產生錯誤的,因爲addVertex爲g雖然屬性它是在Graph的原型中定義的,但它仍然是Graph的一部分。另外我還有一個問題,即如果某個對象從g繼承(或者說Graph),它將只繼承addVertex(在Prototype的函數中定義的那些),否則它將繼承圖的所有三個屬性即頂點,邊和addVertex。謝謝您的幫助!

+1

出於好奇,因爲您花時間學習新東西,爲什麼不直接升級到ES6課程?它更具可讀性並具有相同的性能。 – Kokodoko

+0

是的,我期待他們,但我現在我聽說他們只是一種syntatical糖和JS仍然是基於原型的語言 – TheHumbleGhost

+0

是的,但這是沒有理由不使用它:)但都在適當的時間。瞭解你所能做的,並決定什麼對你有用。 – Kokodoko

回答

1

由於hasOwnProperty具體說,它在inherited屬性

MDN返回false:

的hasOwnProperty()方法返回一個布爾值,指示 對象是否具有指定的屬性作爲自己的(未繼承)屬性。

關於你的第二個問題 - 這取決於究竟你怎麼有一個對象從Graph繼承。在ES5的方式,我這樣做:

var InheritedFromGraph = function() { 
    Graph.call(this); 
} 

InheritedFromGraph.prototype = Graph.prototype; 

,然後,是的,InheritedGraph將獲得屬性verticiesedgeGraph在它的構造函數中定義。

+0

感謝您的答案,但你的意思是說,addVertex已被繼承,但我明確地在Graph.prototype中定義它,如果它是繼承的,那麼其成員是addVertex就像頂點和邊是Graph的屬性? – TheHumbleGhost

+0

'Graph.prototype'上的一個屬性**與'Graph'上的屬性**不一樣** – Adam

+0

這兩者之間有什麼區別? – TheHumbleGhost

2

爲什麼g.hasOwnProperty( 'addVertex')產生false

就是那樣hasOwnProperty作品。從MDN

hasOwnProperty()方法返回一個布爾值,指示對象是否具有指定的屬性作爲自己的(不繼承)屬性。

因此,hasOwnProperty做它的檢查時不會遍歷原型鏈。

您可以使用in運算符來檢查原型鏈中的屬性。