現在對自己之前理解的東西,總結下,整理到這,看我那會畫的一張圖,我都不知道在說什麼,那會的瞬間都疏通的感覺,現在基本都模糊了,我這腦子真是。。。 言歸正傳 開始: 一:思考new都做了什麼,下麵一個例子 new一個構造函數, 1:會先新建一個對象,比如 var o={}; 2:然後o對象的__pro ...
現在對自己之前理解的東西,總結下,整理到這,看我那會畫的一張圖,我都不知道在說什麼,那會的瞬間都疏通的感覺,現在基本都模糊了,我這腦子真是。。。
言歸正傳 開始:
一:思考new都做了什麼,下麵一個例子
function A (){ var a1=111; this.a2=222; function fa(){ console.log(a1); } fa(); } A.prototype.a3="333"; var b = new A();
new一個構造函數,
1:會先新建一個對象,比如 var o={};
2:然後o對象的__proto__=A函數的prototype,
3:以o為執行環境執行A,A.apply(o,[arg])
apply是什麼,就是執行時,改變執行上下文,把A執行環境中的this 變成o,
看到很多地方說,apply與call的區別,我認為區別就是他們兩個傳參不同,apply是數組形式 :apply(obj,argument)argment是一個數組,call直接是值形式 :call(obj,name,age)
4:看A函數返回值的情況,然後b是什麼,針對上一個的例子,b指向 {a2:222} ,裡面的__proto__ ,constructor等一會說
文章中黃色部分不大理解,按說他是系統生成的o對象,但是他為什麼是A{}?
現在來看a方法返回值的各種情況的列子,來看b是什麼
1:什麼不返回的情況
2:返回 數據類型的情況
3:返回 引用類型的情況
總結,當new一個函數時,如果函數有返回,如果是數據類型,直接忽視,返回系統生成的對象,如果返回的複雜數據類型,那麼就是複雜數據類型,如果沒有返回,就是系統生成的對象
二 prototype
每個函數都有prototype(原型)屬性,他的值是對象(屬性集合)
只有一個constructor 屬性,指向本身,既然他的值是對象,包括constructor和__proto__屬性,同時可以自定義屬性,例如:
三:__proto__
__proto__是隱形屬性,每個對象都有這個屬性,實例化對象的__proto__值是指向該對象的prototype
四:自定函數 對象 Object Function他們之間prototype __proto__的聯繫
註意自定義函數b的prototype屬性集合中的__proto__,或是說整個prototype是對象,他的__proto__,指向的是最底層的Object對象,如果下麵這種new的情況,
var a = function() { this.a1="a";};
var b = function() { this.b1="b";};
var c = function() { this.c1="c";};
b.prototype = new a();
c.prototype = new b();
b.prototype={a1:"a"};
b.prototype.__proto__=a.prototype ,a.prototype的值 是constructor 和__proto__(指向的是最底層的Object{}),
c.prototype={b1:"b"};
c.prototype.__proto__=b.prototype ——》指向{a1:"a"};
不知道有沒有理解不對的地方啊啊啊啊啊。。。。