下面的理解是錯的,只是個筆記。代表我曾經的思考。
學習JavaScript時需要將prototype和__proto__分清,Quora中有一篇解釋挺好。
_________________________________________________________________________________________
對於原型繼承我現在仍舊比較模糊,但我感覺這完全不是以前子類,父類似的繼承。他們有著完全不同的東西。
原型是一個object,JavaScript中沒有類型的概念。 JavaScript中所有的東西除了基本類型,就是object。一個object的原型也是一個object。我們看代碼:
function Person(){};function Worker(){};var w = new Worker(); w.prototype=new Person(); //w(一個object)的原型也是一個objectw.prototype.say = function{alert("hi")};
這裡的say方法只添加到當前的對象(object)w中(直的嗎?這個說法其實是模糊的),並不影響Worker()這個函數。 所以當
var w2=new Worker();
並不會有say函數的實現。即w與w2是兩個獨立的object.
如果說w與w2區別就是w對象多了一個say函數?如果這麼說的話那w.prototype.say=function{};與w.say=function區別是什麼呢?
我能想到的區別就是w.say是給當前object加一個屬性,而w.prototype.say是給w的原形對象(即通過new Person()建立的一個object)加一個屬性。
我們來看一段代碼:
var w1 = new Worker(); //implicit prototype link w1.prototype = new Person(); //explict prototype propertyw1.prototype.say = function(){alert('hi')};var w2 = new Worker();w2.prototype = new Person();w2.say = function(){alert('hi')};var w3 = new Worker(); //implict prototype link to WorkerWorker.prototype.say = function(){}; //Worker prototype adding say can be access by w1.w3Person.prototype.say = function(){}; //explicit prototype, can't be access by w1.w3
到目前為止我還是不理解,為什麼w1.say是undefined, w3.say確是function。
我想用圖來解釋上面一段代碼,注意中都是對象(object),沒有類,即使函數也是對象(想想JavaScript中內建Function對象):