Javascript面象對(duì)象成員、共享成員變量實(shí)驗(yàn)
var f = function d() {
this.a = "a";/*這句運(yùn)行后不存在f.a也不存在d.a存在一個(gè)window.a*/
var b = "b";/*局部變量*/
};
var o = { ff: function () {
var a = "a"; /*局部變量*/
this.b = "b"; /*這句運(yùn)行后存在o.b*/
}
};
function Man(){
this.age = 30;
};
Man.prototype.sex = 1;
Man.prototype.name = function () {
};
debugger;/*第一處斷點(diǎn)*/
f();
o.ff();
var m = new Man();
debugger; /*第二處斷點(diǎn)*/
第一處斷點(diǎn)時(shí)對(duì)象成員的存在情況:

第二處斷點(diǎn)時(shí)對(duì)象成員的存在情況:

一句話:關(guān)于js函數(shù):this指的是所在函數(shù)外最近一層的對(duì)象,而嵌套函數(shù)的內(nèi)部函數(shù)內(nèi)的this指的是window對(duì)象。
一句話:js的oo特性:使用this.成員方式定義對(duì)象的成員使用對(duì)象具有js特有的動(dòng)態(tài)持性,類(lèi)與對(duì)象實(shí)例有差異的,而.prototype.成員定義成員是經(jīng)典的定義方式,類(lèi)與對(duì)象實(shí)例是統(tǒng)一的。
2)Javascript對(duì)象共享性成員變量實(shí)驗(yàn):
function Ghost(_name) {
this.name = _name;
this.age = 1000;
}
Ghost.prototype.setName = function (_name) {
this.name = _name;
}
function Man(_name){
this.age = 30;
this.ghost = new Ghost("實(shí)例變量" + _name);
};
Man.prototype.ManGhost = new Ghost("共享變量");
var a = new Man("a");
var b = new Man("b");
var amg = a.ManGhost.setName("我只設(shè)置a的共享變量");
debugger; /*第一處斷點(diǎn)*/
var ag = a.ghost;
var bg = b.ghost;
var bmg = b.ManGhost;
debugger; /*第二處斷點(diǎn)*/
運(yùn)行到第一片斷點(diǎn):

簡(jiǎn)單變量與對(duì)象變量的差別
使用.prototype.定義的成員,如果該成員為簡(jiǎn)單變量則,每個(gè)對(duì)象實(shí)例都有一個(gè)各自的副本。(例如:Man.prototype.noObejctVar)
使用.prototype.定義的成員,如果該成員對(duì)象變量,則每個(gè)對(duì)象實(shí)例都共享同一個(gè)對(duì)象副本。(例如:Man.prototype.ManGhost)
為什么有這樣的差別呢?單從ManGhost變量與noObjectVar變量它們都是使用.prototype.定義的成員是沒(méi)有差別的,只是它們類(lèi)型不同,表示它們?cè)L問(wèn)和使用用它們的方式是不同的,只是ManGhost變量?jī)?nèi)存放的是new出來(lái)的對(duì)象,而noObjectVar變量?jī)?nèi)存放的是值(或某種值的引用),換句話說(shuō)ManGhost存放的是對(duì)象的引用,通過(guò)這個(gè)引用可以操作這個(gè)對(duì)象,noObjectVar變量?jī)?nèi)存放也可是某種值引用,可是無(wú)法使用這個(gè)引用來(lái)操作它.
從另一個(gè)視角看
noObjectVar變量存放的是字串對(duì)象的引用.
a.noObjectVar="新字符串a(chǎn)";
這表示noObjectVar從原來(lái)的存放字符串對(duì)象引用,指向新字符串對(duì)象引用.(也可以說(shuō)新的字符串對(duì)象覆蓋原字符串對(duì)象)
a.ManGhost=new Ghost("a");
b.ManGhost=new Ghost("b");
這樣a與b就不存在共享對(duì)象的問(wèn)題了.不過(guò)這樣就存在另一個(gè)問(wèn)題.prototype.ManGhost時(shí)定義新建的對(duì)象就浪費(fèi)了.不過(guò)這樣使用.prototype.是錯(cuò)誤的.
使用.prototype.定義成員函數(shù)及定義共享變量才是正確的用法.
使用javascript來(lái)正確的定義類(lèi)請(qǐng)見(jiàn):[技術(shù)備忘錄](méi)javascript來(lái)定義類(lèi)的規(guī)范
- js 多種變量定義(對(duì)象直接量,數(shù)組直接量和函數(shù)直接量)
- JavaScript判斷變量是對(duì)象還是數(shù)組的方法
- JavaScript面向?qū)ο笾接徐o態(tài)變量實(shí)例分析
- 淺談js函數(shù)中的實(shí)例對(duì)象、類(lèi)對(duì)象、局部變量(局部函數(shù))
- JavaScript中判斷變量是數(shù)組、函數(shù)或是對(duì)象類(lèi)型的方法
- JavaScript面向?qū)ο笾叽蠡驹瓌t實(shí)例詳解
- JS 創(chuàng)建對(duì)象的模式實(shí)例小結(jié)
- JS對(duì)象屬性的檢測(cè)與獲取操作實(shí)例分析
- 用原生JS獲取CLASS對(duì)象(很簡(jiǎn)單實(shí)用)
- JavaScript 三種創(chuàng)建對(duì)象的方法
- JS 創(chuàng)建對(duì)象(常見(jiàn)的幾種方法)
- 原生JavaScript創(chuàng)建不可變對(duì)象的方法簡(jiǎn)單示例
相關(guān)文章
從柯里化分析JavaScript重要的高階函數(shù)實(shí)例
這篇文章主要為大家介紹了從柯里化分析JavaScript重要的高階函數(shù)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
JS實(shí)現(xiàn)簡(jiǎn)單抖動(dòng)效果
這篇文章給大家結(jié)束了通過(guò)js實(shí)現(xiàn)抖動(dòng)效果,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友參考下吧2017-06-06
詳解JavaScript?(!!)?中的雙感嘆號(hào)是干什么用的
JavaScript?不是靜態(tài)語(yǔ)言,而是動(dòng)態(tài)語(yǔ)言,這意味著變量可以引用或保存任何類(lèi)型的值,此外,該類(lèi)型可以隨時(shí)更改,這篇文章主要介紹了JavaScript?(!!)?中的雙感嘆號(hào)作用,需要的朋友可以參考下2022-09-09
javascript 7行代碼畫(huà)出一個(gè)圍棋棋盤(pán)
javascript 只有7行代碼即可畫(huà)出圍棋棋盤(pán)的實(shí)現(xiàn)代碼。大家可以看看。2009-07-07
JS實(shí)現(xiàn)的新浪微博大廳文字內(nèi)容滾動(dòng)效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)的新浪微博大廳文字內(nèi)容滾動(dòng)效果代碼,可實(shí)現(xiàn)頁(yè)面圖文元素定時(shí)滾動(dòng)的效果,涉及JavaScript時(shí)間函數(shù)定時(shí)改變頁(yè)面元素的相關(guān)技巧,需要的朋友可以參考下2015-11-11
js中獲取鍵盤(pán)事件的簡(jiǎn)單實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇js中獲取鍵盤(pán)事件的簡(jiǎn)單實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10
關(guān)于laydate.js加載laydate.css路徑錯(cuò)誤問(wèn)題解決
日期時(shí)間選擇插件 laydate.js相信對(duì)大家來(lái)說(shuō)都不陌生,這篇文章主要給大家介紹了關(guān)于laydate.js加載laydate.css路徑錯(cuò)誤問(wèn)題解決的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-12-12

