請將下面代碼直接複製到瀏覽器
console面板執行查看結果
console.log('');console.log('');console.log('***********************************建構函式聲明***********************************************************');console.warn('-------共有2個建構函式,其中MyObjectEx1、MyObjectEx2分別繼承了MyObject-------');console.warn('建構函式1: MyObject');function MyObject() { this.xxx = new Array(); } MyObject.prototype.yyy = new Array(); console.warn('建構函式2: MyObjectEx1');function MyObjectEx1() { this.zzz = new Array();} MyObjectEx1.prototype = new MyObject(); MyObjectEx1.prototype.aaa = new Array();MyObjectEx1.prototype.constructor = MyObjectEx1;console.log('');console.log('-----------------------執行個體化變數: MyObject------------------------------');var obj1 = new MyObject();var obj2 = new MyObject();obj1.xxx.push('我是MyObject的公有屬性zzz,我是obj1');obj1.yyy.push('我是MyObject的原型屬性yyy, 繼承我的每個執行個體都有我這個屬性');obj2.xxx.push('我是MyObject的公有屬性zzz,我是obj2');console.warn("var obj1 = new MyObject();");console.warn("var obj2 = new MyObject();");console.warn("obj1.xxx.push('我是MyObject的公有屬性zzz,我是obj1');");console.warn("obj1.yyy.push('我是MyObject的原型屬性yyy, 繼承我的每個執行個體都有我這個屬性');");console.warn("obj2.xxx.push('我是MyObject的公有屬性zzz,我是obj2');");console.warn('-------------上面執行個體化變數後的結果列印-------------');console.log('obj1:', obj1);console.log('obj2:', obj2);console.log('');console.warn('-----------------------執行個體化變數: MyObjectEx1-----------------------');var objEx1 = new MyObjectEx1();var objEx2 = new MyObjectEx1();console.warn("var objEx1 = new MyObjectEx1();");console.warn("var objEx2 = new MyObjectEx1();");console.warn('-------------改變objEx1和objEx2中屬性的值-------------');objEx1.zzz.push('我是MyObjectEx1的公有屬性,我的值是objEx1');objEx2.zzz.push('我是MyObjectEx1的公有屬性,我的值是objEx2');objEx1.xxx.push('通過objEx1向父類xxx添加一個元素');objEx2.xxx.push('通過objEx2向父類xxx添加一個元素');objEx1.yyy.push('通過objEx1向父類yyy添加一個元素');objEx2.yyy.push('通過objEx2向父類yyy添加一個元素');console.warn("objEx1.zzz.push('我是MyObjectEx1的公有屬性,我的值是objEx1');");console.warn("objEx2.zzz.push('我是MyObjectEx1的公有屬性,我的值是objEx2');");console.warn("objEx1.xxx.push('通過objEx1向父類xxx添加一個元素');");console.warn("objEx2.xxx.push('通過objEx2向父類xxx添加一個元素');");console.warn("objEx1.yyy.push('通過objEx1向父類yyy添加一個元素');");console.warn("objEx1.yyy.push('通過objEx2向父類yyy添加一個元素');");console.warn('-------------上面執行個體化變數後的結果列印-------------');console.log('objEx1:', objEx1);console.log('objEx2:', objEx2);console.warn('由此可以看出對於繼承關聯節點中的每一個構造器中的公有屬性,在其下屬的構造器中(繼承該構造器的子構造器),構造器公有屬性體現為每個子類執行個體所持有的一個‘特殊’的屬性,儘管大家都有這個屬性,但是這個屬性的值有該執行個體所持有,通過‘.’的方式直接對其取值或賦值,但是對不同的執行個體化對象,其可能是不同的,但是對於通過prototype定義的原型屬性,對於所有的子類皆可以看做是一個‘局部全域變數’,可以當做引用來看,這是有區別的');
1.
原型鏈是一個由有限對象組成的對象鏈,用於實現繼承和共用屬性。 2. 對於instanceof這個關鍵字,更重要的意義是檢查一個對象的歸屬問題,也即繼承關係上歸屬,和建立該變數的類本省的關係不大,new 的過程其實更多的是體現繼承關係(維護原型鏈)的,我們可以為執行個體對象維護obj.constructor屬性的,讓其指向類的構造器,從而實現最為完整的原型鏈效果,其次對於一個類而言,構造器(Function)持有一個prototype屬性,當我們new出其執行個體對象之後,又將為其執行個體維護不可見屬性__proto__屬性,和類的prototype實現映射關係,對於__proto__屬性,則體現了樹的特點,每一個繼承層級都有自己相應的屬性和方法(使用原型的重要核心是繼承樹的建立。這一過程要求new運算子的參與,簡單說來,就是"子類.prototype"必須賦值為"new 父類()"所產生的一個執行個體) 3. 對於typeof操作符,其強調後者的類型,所謂類型,也就是javascript的資料類型, 它的結果可能是String, Number, Function, Object(Null), Undefined, Boolean之一。 4. 所謂完整的原型繼承鏈中的每一個類執行個體的繼承層級關係樹上都應該有自己的構造器函數,也就是說對於一個原型鏈中的所有的類都有建構函式時的原型鏈才是最完整的原型鏈,其次對於用關鍵字function修飾時(函數)才有prototype屬性,因此可以看出,其實prototype就是用來集中體現類的擴充方法或繼承關係。 5. 每一個變數或是對象都有__proto__屬性,而且這個屬性在大多數瀏覽器中是不可見的,只有手動方式才可以查看,__proto__屬性是執行個體在原型鏈上的體現,任何對象都具有__proto__屬性的,用來體現鏈的性質,最頂層則是Object。