成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

淺談JS中的構(gòu)造函數(shù)、原型對象(prototype)、實例中的屬性/方法之間的關(guān)系

kevin / 2061人閱讀

摘要:同時給該構(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

相關(guān)文章

  • js面向對象淺談(二)

    摘要:我們通過這個構(gòu)造函數(shù)為原型對象添加其他方法和屬性。這個屬性存在與實例與構(gòu)造函數(shù)的原型對象上直接,而不存在于實例與構(gòu)造函數(shù)之間。李小花班花張全蛋張全蛋李小花李小花我們在遍歷對象的的屬性的時候,經(jīng)常需要判斷屬性是否來自于對象的原型還是屬性。 引言 上面說了創(chuàng)建對象有字面量方式和工廠模式還有構(gòu)造函數(shù)模式,結(jié)果發(fā)現(xiàn)他們都各自有缺點,所以下面再給大家介紹幾種創(chuàng)建對象的方式,爭取能找到一種無痛的模...

    Yuanf 評論0 收藏0
  • 淺談javascript原型原型

    摘要:在中,主要有兩種創(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...

    includecmath 評論0 收藏0
  • 淺談 JavaScript 原型

    摘要:數(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...

    explorer_ddf 評論0 收藏0
  • 淺談JavaScript原型原型

    摘要:在講原型之前,先簡單介紹一下幾個概念構(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...

    Zoom 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<