JS如何做到面向?qū)ο?/h1>

JS本省沒有面向?qū)ο?,它是如何來做類,和類的實例的呢??/p>
1: 函數(shù)對象的prototype
???每個函數(shù)對象都有一個prototype成員,指向一個表,?
function a() {}; ??a.prototype 指向一個表對象
2: 表的__proto__
??每個js表(Object)對象,都會有一個成員__proto__,?指向一個表(Object)對象。當我們訪問這個Object的key的時候,先在它自己的表里找,如果沒有找到,接著在它的__proto__表里找,如果__proto__表里沒有,到__proto__表里的__proto__表里找,….只到全部搜索完成;
?
3:?new+ 函數(shù)機制
??var a = new A(); 這個是一個典型的new +?函數(shù)的模式,
在JS里面我們將A函數(shù)稱為構(gòu)造函數(shù),?那么new A()到底做了哪些事情呢?
(1)參生了一個新的表對象{}, 下稱instance;
(2)將instance,作為this, 傳遞給A函數(shù);
(3) 將A函數(shù)的prototype表種的key, value復(fù)制到instance表里面的__proto__下面;
(4) 返回 新的對象表實例instace;
4: js 如何面向?qū)ο?/strong>
(1)定義構(gòu)造函數(shù):
Function Person() { … …}
(2) 往構(gòu)造函數(shù)的prototype表里面加成員函數(shù)
???Persion.prototype.set_age = function(age) {}
(3) new + 構(gòu)造函數(shù)后得到的新對象;
??Var a = new Person();?a 是一個表?{… , __proto__: {set_age: 函數(shù)對象(來源于prototype)}},
?
(4) a.set_age(10); 在a實例表里面找,?沒有找到set_age,
就到__proto__里面找,找到了,所以a.set_age() 就調(diào)用到了上面的set_age函數(shù),根據(jù)隱式傳遞this, 進入set_age后this是a實例;
?
所以,a是Person的實例,通過實例,可以調(diào)用到類的方法,這個是js面向?qū)ο蟮谋举|(zhì),你搞懂了么?還是暈了,
如果暈了,再看幾次。