JS中的prototype 值得思考的幾個問題

補充下博主關於原型鏈繼承的幾個問題: 
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

以上是我的的幾個原型使用的觀點,若是有什麼錯誤,請博主指正批評。正則表達式

相關文章
相關標籤/搜索