摘要:同時給該構(gòu)造函數(shù)自動添加一個屬性,該屬性為指針,指向原型對象??偨Y(jié)構(gòu)造函數(shù)中的屬性和方法僅為聲明和定義,一旦實例化工作完成后。實例對象自身的屬性和方法與構(gòu)造函數(shù)將不在存在關(guān)聯(lián)關(guān)系。
構(gòu)造函數(shù):函數(shù)中的一種,通過關(guān)鍵字new可以創(chuàng)建其實例。為了便于區(qū)分,通常首字母大寫;
原型對象:一種特殊的對象,構(gòu)造函數(shù)創(chuàng)建時即自動生成;與構(gòu)造函數(shù)形成一一對應(yīng),如同人和影子般的關(guān)系;
實例:通過構(gòu)造函數(shù)實例出來的對象;
在定義構(gòu)造函數(shù)時,在其內(nèi)部(“{“和”}”)進行定義屬性和方法。當(dāng)我們通過關(guān)鍵字new,對構(gòu)造函數(shù)進行實例化的時候。實例會對構(gòu)造函數(shù)的這些屬性進行拷貝出一份副本,然后將其歸屬為當(dāng)前實例。不同實例間的屬性和方法是完全獨立的,如下例子:
function Person(name,age){ this.name = name; this.age = age; this.sayName = function(){ alert(this.name); }; } var HL = new Person("hailing",18); var JJ = new Person("jiajia",20); HL.sayName(); // hailing JJ.sayName(); // jiajia HL.name = "HAILING"; HL.sayName(); // HAILING JJ.sayName(); // jiajia
我們通過創(chuàng)建了new對Person進行實例化兩個對象“HL”、“JJ”,當(dāng)我們在修改“HL”的名字時,“JJ”的名字不會隨之而改變。
程序執(zhí)行時,會自動生成一個原型對象(prototype)與之相關(guān)聯(lián)。同時給該構(gòu)造函數(shù)自動添加一個屬性:prototype,該屬性為指針,指向原型對象。同時,也給該原型對象添加一個屬性:constructor,該屬性也為指針,指向與其對應(yīng)的構(gòu)造函數(shù)。此時,原型對象中只會包含些默認(rèn)的方法和屬性。
實例化完成后,所有實例均會與原型對象形成多對一的隱性關(guān)聯(lián)關(guān)系。所有實例會共享原型對象的屬性和方法,當(dāng)然也包括constructor。當(dāng)原型對象被添加一個屬性或者方法后,均會被所有實例共享,即可以通過任意一個實例進行訪問。如果原型對象的屬性或方法與實例的屬性或方法名稱一致,則實例自身的屬性或方法優(yōu)先級高于原型對象上的:
Person.prototype.sex = "girl"; Person.prototype.saySex = function (){ alert(this.sex); }; alert(HL.saySex === JJ.saySex); // true alert(HL.saySex === Person.prototype.saySex); // true Person.prototype.stature = 165; alert(HL.stature); // 165 alert(JJ.stature); // 165 HL.stature = 160; alert(HL.stature); // 160 alert(JJ.stature); // 165 delete HL.stature; Person.prototype.stature = 170; alert(HL.stature); // 170 alert(JJ.stature); // 170
例子中,給原型對象增加了sex屬性和saySex方法,此時通過實例對象“HL”和“JJ”訪問并且進行比較,同時也和原型對象自身的saySex進行比較,結(jié)果為ture;而后又給原型對象增加了stature屬性,此時“HL”和“JJ”中均無此屬性,故訪問了原型對象中的stature屬性。當(dāng)我們多帶帶給“HL”增加了stature屬性后,“HL”不在訪問原型對象,而是訪問“HL”自身的該屬性。當(dāng)我們通過關(guān)鍵字“delete”刪除“HL”自身的屬性后,再次訪問時,又回重新訪問原型對象上的屬性。
總結(jié): 構(gòu)造函數(shù)中的屬性和方法僅為聲明和定義,一旦實例化工作完成后。實例對象自身的屬性和方法與構(gòu)造函數(shù)將不在存在關(guān)聯(lián)關(guān)系。原型對象與實例對象形成“備胎”關(guān)系,當(dāng)通過對象訪問屬性或方法時,程序會優(yōu)先搜索對象本身的屬性或方法,不存在才會訪問原型對象的方法或者屬性。
因此,當(dāng)多個實例需要使用同一個屬性或方法時,我們應(yīng)該將該方法放于原型對象上,從而避免相同屬性或方法多次獨立存在于多個對象導(dǎo)致內(nèi)存浪費。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99104.html
摘要:我們通過這個構(gòu)造函數(shù)為原型對象添加其他方法和屬性。這個屬性存在與實例與構(gòu)造函數(shù)的原型對象上直接,而不存在于實例與構(gòu)造函數(shù)之間。李小花班花張全蛋張全蛋李小花李小花我們在遍歷對象的的屬性的時候,經(jīng)常需要判斷屬性是否來自于對象的原型還是屬性。 引言 上面說了創(chuàng)建對象有字面量方式和工廠模式還有構(gòu)造函數(shù)模式,結(jié)果發(fā)現(xiàn)他們都各自有缺點,所以下面再給大家介紹幾種創(chuàng)建對象的方式,爭取能找到一種無痛的模...
摘要:在中,主要有兩種創(chuàng)建對象的方法分別是對象字面量以及調(diào)用構(gòu)造函數(shù)對象字面量調(diào)用構(gòu)造函數(shù)其實上述兩種創(chuàng)建對象的方法,本質(zhì)上是一樣的,都是引擎調(diào)用對象的構(gòu)造函數(shù)來新建出一個對象。 原型與原型鏈?zhǔn)莏avascript里面最最核心的內(nèi)容,如果不能理解它們之間的存在關(guān)系的話,那么我們是不能理解這門語言的。 在JS中,主要有兩種創(chuàng)建對象的方法, 分別是對象字面量以及調(diào)用構(gòu)造函數(shù) //對象字面量 va...
摘要:數(shù)組的構(gòu)造函數(shù)是原型鏈的指向與其他除以外的構(gòu)造函數(shù)相同,的也指向頂級原型對象,每一個數(shù)組都是的實例,都指向。實例對象查找構(gòu)造函數(shù)原型對象的方法一般會把對象共有的屬性和方法都放在構(gòu)造函數(shù)的原型對象上。 showImg(https://segmentfault.com/img/remote/1460000018998704?w=900&h=506); 閱讀原文 概述 在 JavaScr...
摘要:在講原型之前,先簡單介紹一下幾個概念構(gòu)造函數(shù)例如上述代碼創(chuàng)建的函數(shù)就被稱為構(gòu)造函數(shù)。同一個構(gòu)造函數(shù)實例化得到的多個對象具有相同的原型對象,所以經(jīng)常使用原型對象來實現(xiàn)繼承。實例對象通過操作構(gòu)造函數(shù)所創(chuàng)建的對象是實例對象。 對于很多前端開發(fā)者而言,JavaScript的原型實在是很讓人頭疼,所以我這邊就整理了一下自己對應(yīng)原型的一點理解,分享給大家,供交流使用 原型 說起原型,那就不得不說p...
閱讀 2966·2021-11-11 16:55
閱讀 528·2021-09-27 13:36
閱讀 1100·2021-09-22 15:35
閱讀 2924·2019-08-30 12:46
閱讀 3134·2019-08-26 17:02
閱讀 1836·2019-08-26 11:56
閱讀 1303·2019-08-26 11:47
閱讀 433·2019-08-23 17:01