JS基礎 建構函式VS原型

2022-08-19 08:51:11 字數 1832 閱讀 5766

js是一種基於物件的語言。在使用過程中不免遇到複製物件的問題。但通常我們採用的直接賦值『obj1=obj2』這樣的做法會出現資料覆蓋問題。

也就是物件引用過程中引用位址一致。導致物件資料被改動的問題。這時我們能夠採用工廠模式來對物件進行例項化,從而實現物件的引用位址一致導致的資料覆蓋問題。

但此時,問題隨之又來了,使用工廠模式,對於詳細的例項所屬的詳細物件又搞不清楚,在js中採用構造方法來解決物件例項的資料覆蓋問題(這裡和其他語言的原理是類似的)。

一、建構函式

在其他語言中接觸過建構函式。通常它與類的名稱一致。但在js中並沒有明白的『類』這個概念。

在我看來,它宣告的物件從某種程度上說就是一種類。由於它的每乙個物件都能夠有自己相應的例項。

建構函式解決資料覆蓋:

function box(name,age) 	}	

function desk(name,age)

}

對它進行呼叫:

var box1=new box('lee',22);

var box2=new desk('john',66);

alert(box1 instanceof box);//true

alert(box2 instanceof box); //能夠識別詳細哪個物件的例項。false

同一時候。建構函式能夠進行物件冒充,來改變物件自身的作用域。實現自身所不能實現的行為。

但同一時候,又引出了另外乙個問題。建構函式體內對於引用型別資料引用位址出現不一致現象,這說明在記憶體中對於全然相等的兩個或多個資料,要用相應大小的記憶體來盛放。這樣無疑造成了記憶體浪費現象。當然,我們能夠採用在建構函式體外將引用型別進行單獨宣告。可是這樣的方法封裝性非常差。非常easy被外界惡意呼叫。所以,這裡js中用到了原型。

二、原型

js中建立的每個函式都有乙個prototype原型屬性。這個屬性也是乙個物件。它的用途是包括能夠由特定型別的全部例項共享的屬性和方法。

例如以下圖所看到的,函式的原型物件為該函式的全部例項所共享。

上圖中__proto__是原型物件的指標,它指向原型物件。同一時候constructor為原型物件的構造屬性,執行詳細的所屬的建構函式物件。

在實際應用中能夠通過constructor屬性來改變乙個原型物件所屬的建構函式物件。   

為函式建立原型屬性和方法:

function box(){} //建構函式體內什麼都沒有,假設有,就叫做例項屬性和例項方法

box.prototype.name='lee';//原型屬性

box.prototype.age=22;

box.prototype.run=function()

用這樣的方法。能夠解決上面遺留的引用位址不一致的問題(建構函式+原型)。

能夠通過box.prototype.isprototypeof(box1)來對例項所屬的原型物件進行推斷。

同一時候在建立函式的原型時,也能夠通過字面量的方法來建立:

box.prototype=

}

以上是有關js中建構函式和原型函式的一些基礎知識。小結一下:

1.建構函式在例項化時,必須使用new來操作。宣告時不須要new object。隱含自身已經new了

2、建構函式能夠用來解決物件例項化中資料覆蓋問題,但會造成引用位址不一致問題

3、原型攻克了引用位址不一致問題

4、原型能夠實現共享但不能進行重寫。會將原來的資訊覆蓋。

對於重寫問題。能夠採用原型+建構函式結合來各司其職。後面再做具體總結。

JS 建構函式 原型 new

1 每個函式都有乙個prototype屬性,該屬性指向函式的原型物件,原型物件的用途是可以讓所有物件例項共享它所包含的屬性和方法。2 預設情況下,每個原型物件都會自動獲得乙個constructor屬性,該屬性指向prototype屬性所在的函式。constructor屬性最初是用來標識物件型別的,但...

JS 原型constructor建構函式

一 物件原型 proto 和建構函式原型物件prototype都有乙個屬性,叫做constructor,稱之為建構函式,主要記錄該物件引用了哪個建構函式,可以讓原型物件重新指向原來的建構函式,這就是為什麼在例項物件中傳遞引數時,建構函式本身不需要寫return返回結果的原因 為了更清晰的看到是否為建...

js建構函式和原型

建立物件的方式 1,物件字面量 var obj1 2,new object var obj2 new object 3,利用建構函式建立物件 建構函式 利用建構函式 可以建立很多個物件 建構函式,把物件中公共屬性和方法抽出來,放在建構函式裡,通過new建立不同的物件 function star na...