久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript中變量的存儲方式

瀏覽:3日期:2023-11-23 15:35:13
基本原理

前面文章提到過,在js中變量包括5中基本類型以及一個復(fù)雜數(shù)據(jù)類型Object,當然常用的函數(shù)和數(shù)組都是對象。對于基本類型和復(fù)雜類型,對應(yīng)著兩種不同的存儲方式–棧存儲和堆存儲。為什么要實現(xiàn)兩種存儲方式的理由很簡單,就是基本類型一旦初始化則內(nèi)存大小固定,訪問變量就是訪問變量的內(nèi)存上實際的數(shù)據(jù),稱之為按值訪問。而對象類型說不定什么時候就會增加自身的大小,內(nèi)存大小不固定。比如動態(tài)添加對象的屬性、動態(tài)增加數(shù)組的大小等等都會使變量大小增加,無法在棧中維護。所以js就把對象類型的變量放到堆中,讓解釋器為其按需分配內(nèi)存,而通過對象的引用指針對其進行訪問,因為對象在堆中的內(nèi)存地址大小是固定的,因此可以將內(nèi)存地址保存在棧內(nèi)存的引用中。這種方式稱之為按引用訪問。 嗯,理解這一點很重要,在以后的編程中可以避免很多問題。 我們來看下如下的代碼:

var a = ’I am a string.’; //a,b,c的變量中保存的都是實際的值,因為他們是基本類型的變量var b = 1010;var c = false;var d = a; //d中保存著和“a值一樣的副本,它們互不影響”a = ’I am different from d’;alert(d); //輸出’I am a string’

以上代碼很好理解,就是說按值訪問的變量復(fù)制“你的就是你的,我的就是我的,咱們都有副本,互不影響。”而對于按引用訪問則稍有不同:

var e = {name : ’I am an object’,setName : function(name){this.name = name;}};var f = e; //賦值操作,實際上的結(jié)果是e,f都是指向那個對象的引用指針f.setName(’I am different from e,I am object f.’);alert(e.name); //對f進行操作,e的值也改變了!

對于引用類型的賦值,說白了,就是把那個對象的指針復(fù)制了過去,兩個指針指向的都是同一個實體對象,不存在副本,原本的對象還是只有一個!好。以上就是基本類型和引用類型的最大最根本的差別!我用一張圖來形象的表示下:

JavaScript中變量的存儲方式

*棧內(nèi)存中存放基本類型變量,以及對象的指針;堆中存放對象實體

JavaScript中變量的存儲方式

*復(fù)制前后棧和堆中的情況

引用類型引發(fā)的問題1.使用原型模型創(chuàng)建對象的問題

我們都知道,在JavaScript OO(Object Oriented)中,使用原型模式創(chuàng)建對象的最大的好處就是可以讓對象實例共享原型(prototype)所包含的屬性和方法。這樣就避免了構(gòu)造函數(shù)模式的缺陷,即每個對象都會有每個方法的副本,每個方法都會在每個實例上重新創(chuàng)建一遍,方法重用無意義的問題。

嗯,使用原型模式是為所有實例共享了方法,但是當原型中有引用類型值的屬性的時候,問題就來了:

var Person = function(){};Person.prototype = {constructor : Person,name : ’Hanzongze’,hobby : [’basketable’, ’swiming’, ’running’], //注意,這里包含著一個引用類型的屬性sayName : function(){alert(this.name);}};var person1 = new Person();var person2 = new Person();person1.hobby.push(’music’);alert(person2.hobby); //輸出為’basketable’, ’swiming’, ’running’,’music’alert(person1.hobby === person2.hobby); //true

由于hobby屬性是引用類型的值,所以由Person構(gòu)造函數(shù)創(chuàng)建出來的實例的hobby屬性,都會指向這一個引用實體,實例對象間的屬性互相干擾。這不是我們想要的結(jié)果,為避免這類問題,解決方案就是組合使用構(gòu)造函數(shù)模型和原型模型:

var Person = function(){this.name = ’Hanzongze’;this.hobby = [’basketable’, ’swiming’, ’running’]; //對引用類型的值使用構(gòu)造函數(shù)模式};Person.prototype = {constructor : Person,sayName : function(){alert(this.name);}};var person1 = new Person();var person2 = new Person();person1.hobby.push(’music’);alert(person2.hobby); //輸出 ’basketable’, ’swiming’, ’running’,說明對person1的修改沒有影響到person2alert(person1.hobby === person2.hobby); //false2.原型繼承中的問題

這個問題與上一個的本質(zhì)其實是一樣的,只不過是發(fā)生在了原型繼承的背景中。看一個原型鏈繼承的問題:

var Person = function(){this.name = ’Hanzongze’;this.hobby = [’basketable’, ’swiming’, ’running’];};Person.prototype = {constructor : Person,sayName : function(){alert(this.name);}};//子類型Studentfunction Student(){}Student.prototype = new Person(); //Student繼承了Personvar student1 = new Student();var student2 = new Student();student1.hobby.push(’music’); //對子類實例student1的引用屬性做了改動var student3 = new Student();alert(student2.hobby); //輸出’basketable’, ’swiming’, ’running’, ’music’alert(student3.hobby); //輸出’basketable’, ’swiming’, ’running’, ’music’

在這段代碼中,可以看到,子類Student繼承自父類Person。但由于使用的是原型繼承,也就是說父類的實例作為了子類的原型,那么實例中的引用類型屬性也就繼承在了子類的原型prototype中去了。則子類的實例共享該引用屬性,相互影響。

解決方案,那就是使用借用構(gòu)造函數(shù)方案(但是也不是理想的方案,理想的方案是組合使用原型鏈和借用構(gòu)造函數(shù)。涉及到了比較多的繼承模式,這里簡單描述,以后會寫一篇詳細的文章):

var Person = function(){this.name = ’Hanzongze’;this.hobby = [’basketable’, ’swiming’, ’running’];};Person.prototype = {constructor : Person,sayName : function(){alert(this.name);}};function Student(){//借用構(gòu)造函數(shù),繼承了PersonPerson.call(this);}var student1 = new Student();var student2 = new Student();student1.hobby.push(’music’);alert(student2.hobby); //輸出’basketable’, ’swiming’, ’running’, ’music’

標簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 日韩快播电影 | 欧美国产在线观看 | 日本中文字幕视频 | 天天干一干 | 亚洲欧美国产精品久久 | 香港黄色录像片 | 午夜合集 | 亚洲九九 | 久久久久亚洲精品 | 亚洲欧洲日韩在线 | 午夜资源 | 亚洲国产精品精华液网站 | 久久久精品一区二区三区 | 日韩一区二区精品视频 | 99精品国产在热久久 | 一级在线观看 | 久久久日本 | 欧美男人的天堂 | 欧美日韩一区二区中文字幕 | 欧美久久久精品 | 欧美激情一区二区三区 | 亚洲精品久久久久久一区二区 | 在线亚洲精品 | 九色91 | 久久久国产一区二区三区四区小说 | 国产精品三级久久久久久电影 | 日韩久久午夜一级啪啪 | 久久久久久久久一区二区三区 | 婷婷色国产偷v国产偷v小说 | 91在线免费观看 | 色在线免费视频 | 日韩视频在线免费观看 | 午夜男人免费视频 | 91成人免费视频 | 超碰人人爱 | 国产成人片 | 欧美大片黄 | 午夜av电影 | 国产高清精品一区二区三区 | 久久综合久久久 | 久久精品99国产精品日本 |