建構函式本身就是乙個函式,只不過該函式是出於建立新物件的目的而建立的。建構函式與其他函式的唯一區別,就在於呼叫他們的方式不同。任何函式,只要通過new操作符來呼叫,那他就可以作為建構函式;而任何函式,如果不通過new操作符來呼叫,那它跟普通函式也沒有什麼兩樣。
// 當做構造函式呼叫
let person1 =
newperson
("wang",45
,"doctor");
person.
sayname()
;//wang
// 作為普通函式呼叫
person
("pan",23
,"student");
//新增到window
window.
sayname()
;//pan
像object 和 array屬於原生建構函式,也可以建立自定義的建構函式,從而定義自定義物件型別的屬性和方法。
自定義建構函式:
function
person
(name,age,job)
}let person1 =
newperson
("pan",23
,"student");
let person2 =
newperson
("wang",45
,"doctor"
);
要建立person的例項,要使用new操作符。以new操作符呼叫person的過程:
1.在記憶體中新建立乙個物件。
2.這個新物件內部的[[prototype]]特性被賦值為建構函式的prototype屬性.
3.建構函式內部的this被賦值為這個新物件(即this指向新物件)。
4.執行建構函式內部**(給新物件新增屬性)。
5.如果建構函式返回非空物件,則返回該物件;否則,返回剛建立的新物件。
按照慣例,建構函式始終都應該以乙個大寫字母開頭,而非建構函式則應該以乙個小寫字母開頭。
使用建構函式的主要問題,就是每個方法都要在每個例項上都建立一遍。
這個問題可以通過將函式定義放到建構函式外部解決。
function
person()
//將sayname方法放在建構函式外面,就不會出現每個例項上都建立一遍的問題了。
//可以通過console.log(person1.sayname===person2.sayname);驗證
function
sayname()
let person1 =
newperson
('pan');
let person2 =
newperson
('wang');
person1.
sayname()
;person2.
sayname()
;
我們建立的每個函式都有乙個prototype (原型)屬性,這個屬性是乙個指標,指向乙個物件,而這個物件的用途是包含可以由所有例項共享的屬性和方法。原型物件的理解:
無論什麼時候,只要建立乙個新函式,就會根據一組特定的規則為該函式建立乙個prototype屬性,這個屬性指向函式的原型物件。在預設情況下,所有原型物件都會自動獲得乙個constructor(建構函式)屬性,這個屬性是乙個指向prototype屬性所在函式的指標。
可以理解為建構函式通過prototype指向原型物件,原型物件通過constructor指向建構函式。原型物件中儲存著屬性可以被所有例項共享。
function
person()
person.prototype.name =
"pan"
;person.prototype.
sayname
=function()
;/**例項1
*通過[[prototype]]指向原型物件中的屬性和方法
*/var person1 =
newperson()
;person1.
sayname()
;//pan
/**例項2
*通過[[prototype]]指向原型物件中的屬性和方法
*/var person2 =
newperson()
;person2.
sayname()
;//pan
和person2.sayname都指向的原型物件中的sayname方法.
console.
log(person1.sayname === person2.sayname)
;//true
person建構函式、原型屬性與兩個例項之間的關係:
person1和person2都包含乙個內部屬性,該屬性只是指向了建構函式的屬性person.prototype,它們與建構函式並沒有直接關係。建構函式和原型物件有直接關係。
建構函式與原型物件
1.建構函式中的屬性和方法我們稱為成員,成員可以新增 2.例項成員 建構函式內部通過this新增的成員 uname,age,sing 就是例項成員 例項成員只能通過例項化的物件來訪問 3.靜態成員 在建構函式本身上新增的成員 靜態成員只能通過建構函式來訪問 建構函式的問題 建構函式方法很好用,但是存...
建構函式,原型物件,
概念 如果函式中的邏輯生成乙個物件的並將其返回,我們就將其稱之為建構函式 回顧,普通函式,如下圖 一 建構函式嚴格意義就是用來生物件的 示例 用普通函式模擬的建構函式 二 建構函式是必須通過new這個關鍵字呼叫的 要改變this的指向 也稱為 例項化乙個物件 執行這個函式,生成乙個物件 它的作用就是...
建構函式 原型物件
物件都會有乙個屬性 proto 指向建構函式的prototype原型物件,之所以我們物件可以使用建構函式prototype原型物件的屬性和方法,就是因為物件有 proto 原型的存在 body p 建構函式 原型物件 p p 雖然構造物件上沒有sing方法,但是原型物件上有,因為 proto 的存在...