補充下博主關於原型鏈繼承的幾個問題:
1.原型鏈中的引用類型。
2.原型鏈不要互相依賴,GC可沒那麼好心幫你建立一個臨時存儲區域。
1 function base () {
this.arr = [];
}
function sub (){
}
sub.prototype= new base();
var a = new sub();
var b = new sub();
console.log(b.arr.length); //0
a.arr[0]='moersing';
console.log(b.arr.length); //1
能夠看出,arr是一個共享的,若是說不適用this.arr而用 var arr = [] 的話,sub訪問不到,只能經過父類的閉包來訪問,可是問題仍是存在的。若是想繼承一個徹底獨立的引用類型:
第一 :
function base () {
this.arr = [];
}
function sub (){
base.call(this);// 先加上一個實例屬性
}
sub.prototype= new base();
var a = new sub();
var b = new sub();
console.log(b.arr.length); //0
a.arr[0]='moersing';
console.log(b.arr.length); //0
console.log(a.arr.length); //修改了a,b不受影響
這個問題能夠解決,可是不完美,能夠看出, a和b有一個實例屬性arr和一個prototype的arr,也就是說。
a.arr[0] = 'moersing' ;
console.log(a.arr.length); //1
delete a.arr; //把屬性實例幹掉
console.log(a.arr.length);// 這個時候訪問的是 prototype的。
因此,理論上來說,這並不能算是完美的,變量也是須要內存的不是嗎?好OK,那麼,接下來,使用另外一種,上面那個叫 借用繼承。
接下來這種方式比較完美,可是也不是那麼複雜,主要是使用借用繼承的思想罷了,也就是說,借用實例和借用原型分開。
function base() {
this.arr = [];
}
base.Constructor = function () { //添加一個原型構造函數
//這裏判斷一下,若是是一個函數,而且不是一個正則表達式對象,IE7會把正則反映成一個function而不是一個object
if (typeof this === 'function' && typeof this.prototype.source === 'undefined') {
var fn = this.prototype;
fn.name = 'moersing';
fn.age = '18';
fn.getFull = function () {
console.log(this.name + '|' + this.age);
};
}
else {
throw new TypeError('this is not a function');
}
};
function sub() {
base.call(this); //借用構造函數,實例化一個實例屬性
}
base.Constructor.call(sub); //再調用父類的方法,構造出一個prototype的。
var a = new sub();
var b = new sub();
a.arr[0] = 'moersing'; //給a實例的引用類型添加一個元素
console.log(a.arr.length); //結果是1
console.log(b.arr.length); //結果是0,也就是沒有收到影響
console.log(a.name); //打印a.prototype的屬性
console.log(b.name); //打印b.prototype的屬性
b.name = 'linfo'; //修改b的。
console.log(b.name); //linfo
console.log(a.name); //a沒有影響,仍是moersing
a.getFull(); //moerisng|18
b.getFull(); //linfo |18
以上是我的的幾個原型使用的觀點,若是有什麼錯誤,請博主指正批評。正則表達式