這個問題坑了我大半天。調bug調的心力交瘁财破。
起因是在做一個生成問卷的項目掰派,其中涉及到各個題型類的繼承,這里用一個簡單的例子來說明左痢。
好了靡羡,上代碼:
先定義一個父類Animal:
function Animal(){
? ? this.name = new Array();
}
接著是子類Dog:
function Dog(){}
Dog.prototype = new Animal(); ? ?//繼承Animal
類定義完成后,新建2個Dog實例:
var tony = new Dog();
tony.name.push("tony");
var jessy = new Dog();
jessy.name.push("jessy");
console.info(jessy.name);
猜猜這里會輸出啥俊性?
原本以為是包含"jessy"的數(shù)組略步,結果沒想到是["tony","jessy"]。
再看一個實例定页,這次新建2個Animal的實例:
var animal1 = new Animal();
var animal2 = new Animal();
animal1.name.push("animal1");
animal2.name.push("animal2");
console.info(animal2.name);
這里卻是輸出了 "animal2"D上瘛!U恪>怪骸!
后來聯(lián)系上new的具體原理也就想明白了宫峦,new返回一個Animal實例岔帽,Dog的原型鏈指向這個Animal實例。
結果后來無論多少個new Dog()导绷,也不會new Animal()犀勒,因此所有的Dog實例實在共享一個數(shù)組屬性的。
結論也很簡單:在繼承時,如果父類屬性中有對象贾费,最好在子類中重新聲明一遍钦购。
另外一種做法也可以是父類在另外的函數(shù)中重新聲明這個屬性,但這樣并不好褂萧。