JavaScript中的setter和getter方法!!
javascript中的setter、getter是平時接觸比較少的方法,其本身也並不是標準方法,只在非ie瀏覽器裡支援(ie核心也許有其他方法可以做到呢?暫時不知其解),但是加以利用可以做許多事情,比如:
1、對資料的訪問限制:
a.value是對value變數的getter方法呼叫,如果在getter方法實現中丟擲異常,可以阻止對value變數的訪問
2、對dom變數進行監聽:
window.name是一個跨域非常好用的dom屬性(大名鼎鼎,詳見百度),如果覆蓋window.name的setter實現則可以實現跨頁面的記憶體非同步通訊
一.Getters和Setters
Getters和Setters使你可以快速獲取或設定一個物件的資料。一般來說,一個物件擁有兩個方法,分別用於獲取和設定某個值,比如:
<span style="font-size:18px;">{ getValue: function(){ return this._value; }, setValue: function(val){ this._value = val; } }</span>
用這種方式寫JavaScript的一個明顯的好處是:你可以用它來隱藏那些不想讓外界直接訪問的屬性。最終的程式碼看起來就像下面這樣(用閉包儲存新建立的Filed物件的value):
<span style="font-size:18px;">function Field(val){ var value = val; this.getValue = function(){ return value; }; this.setValue = function(val){ value = val; }; } </span>
於是我們可以這樣使用:<span style="font-size:18px;">var field = new Field("test"); field.value // => undefined field.setValue("test2") field.getValue() // => "test2" </span>
我們來模擬上例中的 “隱藏的value屬性”,我們的程式碼就像這樣:
<span style="font-size:18px;">function Field(val){ var value = val; this.__defineGetter__("value", function(){ return value; }); this.__defineSetter__("value", function(val){ value = val; }); }</span>
但是呢,你不喜歡這樣寫,而傾向在物件的prototype中定義getters和setters(私有變數寫在哪並不重要),我們可以用另一種語法。
<span style="font-size:18px;">function Field(val){ this.value = val; } Field.prototype = { get value(){ return this._value; }, set value(val){ this._value = val; } };</span>
這種語法看起來很不可思議,但是使用過一段時間之後,接受它也很容易。
接下來是另一個例子,它允許外界獲取一個username陣列,但是卻不能獲取原始的,隱藏的user物件。
<span style="font-size:18px;">function Site(users){ this.__defineGetter__("users", function(){ // JS 1.6 Array map() return users.map(function(user){ return user.name; }); }; }</span>
記住以下幾點:
- 一個物件內,每個變數只能有一個getter或setter。(因此value可以有一個getter和一個setter,但是value絕沒有兩個getters)
- 刪除getter或setter的唯一方法是:delete object[name]。delete可以刪除一些常見的屬性,getters和setters。
- 如果使用__defineGetter__或__defineSetter__,它會重寫之前定義的相同名稱的getter或setter,甚至是屬性(property)。
平臺
支援的瀏覽器有:
Firefox
Safari 3+
Opera 9.5
相關推薦
JavaScript中的setter和getter方法!!
javascript中的setter、getter是平時接觸比較少的方法,其本身也並不是標準方法,只在非ie瀏覽器裡支援(ie核心也許有其他方法可以做到呢?暫時不知其解),但是加以利用可以做許多事情,比如: 1、對資料的訪問限制: a.value是對value變數
iOS開發核心語言Objective C —— 面向對象思維、setter和getter方法及點語法
才幹 各路 alt .net 行為 變量的作用域 fadein 格式 讀取 本分享是面向有意向從事iOS開發的夥伴們。或者已經從事了iOS的開發人員。假設您對iOS開發有極高的興趣,能夠與我一起探討iOS開發。一起學習,共同進步。假設您是零基礎,建議您先
javascript中encodeURI和decodeURI方法
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
JavaScript中call和apply方法的使用
acvaScript中的call()方法和apply()方法,在某些時候這兩個方法還確實是十分重要的。1. 每個函式都包含兩個非繼承而來的方法:call()方法和apply()方法。2. 相同點:這兩個方法的作用是一樣的。都是在特定的作用域中呼叫函式,等於設定函式體內this物件的值,以擴充函式賴以執行的作用
Swift開發筆記3.Swift中setter和getter的基本用法
Swift中有儲存屬性和計算屬性兩種。其中在計算屬性中可以實現setter和getter方法,我們在playground中定義兩個結構體: struct Point { var x = 0.0, y = 0.0 } struct Size { var wi
javascript中call()和apply()方法的區別
首先需要知道 call 和 apply 都是js 物件 prototype的方法 在使用的時候主要區別: var foo() = function(){ ....//程式碼段 } // foo.
【C#總結】setter和getter方法 ToString方法
C#中方法名字都是大寫開頭的 String就是string的一個別名。String是.net框架中的,string是C#中的 屬性就是保護欄位的就是一些setter和getter方法 class Person { private Stri
玩轉Eclipse — 自動生成setter和getter方法
我們在程式開發過程中,往往要編寫這樣的類:類的部分或者全部屬性不希望讓外部世界直接訪問,而不用public欄位修飾。這樣,方法呼叫成了訪問這些屬性的唯一途徑。JavaBean就是一個很好的例子,其嚴格遵守面向物件的設計邏輯,所有屬性都是private。對於任
JavaScript中setTimeout()和setInterval()兩個定時器的區別和使用方法
兩者最直接的區別是: setTimeout()在載入後延遲指定時間去執行一次表示式,只是一次。 setInterval()它從載入後,每隔指定的時間就執行一次表示式 所以要讓一段程式碼, 某個函式以固定頻率重複執行應該使用setInterval()函式 如果讓一段程式碼, 某個函式在
JavaScript中函式和方法
在一個物件中繫結函式,稱為這個物件的方法。在JavaScript中,物件的定義是這樣的 var xiaoming = { name: '小明', birth: 1990 }; 但是,如果我們給xiaoming繫結一個函式,就可以做更多的事情。比如,寫個age()方法,返回xiaomi
javascript中陣列和字串的方法比較
前面的話 字串和陣列有很多的相同之處,它們的方法眾多,且相似度很高;但它們又有不同之處,字串是不可變值,於是可以把其看作只讀的陣列。本文將對字串和陣列的類似方法進行比較 可索引 ECMAScript5定義了一種訪問字元的方法,使用方括號加數字索引來訪問字串中的特定字元 可索引的字串的最
JavaScript中陣列和字串的方法以及互相轉換
陣列和字串之間相互轉換:Array和String之間轉換 字串轉陣列: var s=’nihao’;//s是一個字串 var ss = s.split(”);//ss是一個數組 陣列轉字串: var s = ss.join(”); var s = ss.toS
javaScript中window物件的方法和屬性
window物件是客戶端JavaScript最高層物件之一,只要開啟瀏覽器視窗,不管該視窗中是否有開啟的網頁,當遇到BODY、FRAMESET或FRAME元素時,都會自動建立window物件的例項。另外,該物件的例項也可由window.open()方法建立。
javascript中陣列常用的方法和屬性
前言 在javascript中,陣列是一種非常重要的資料型別,我們時常會和它打交道,最近在開發專案中頻繁的使用到陣列,但是自己對陣列的眾多方法已經是非常模糊了,為了方便自己以後能夠更好的使用陣列中的屬性和方法,在此記錄一下。 陣列常用的屬性和方法 常用屬性 Array.length:返回陣列的
JavaScript中String和JSON互換
轉為json 對象 沒有 解析 字符 hack json字符串 span rgb 最簡答的方式是:JSON.parse(obj) 將json對象解析為json字符串JSON.stringify(str) 將json字符串轉為json對象。需要註意的是早期的IE瀏覽器是沒有J
Javascript中innerHTML和innerText的區別
utf meta charset 測試 第一個 class utf-8 html標簽 技術分享 innerHTML:獲取的是從對象的起始位置到終止位置的全部內容,包括HTML標簽 innerText:獲取的是起始位置到終止位置的內容,但是會將HTML標簽去掉 下面寫一段代碼
javascript中typeof和instanceof
display eof 技術分享 style jpg ref ceo height play typeofjavascript中typeof和instanceof
JavaScript中Null和undefind區別
cdc 如何 undefine 只有一個 som pre cnblogs 定義 報錯 公眾號原文 Javascript有5種基本類型:Boolean,Number,Null,Undefined,String;和一種復雜類型:Object(對象); undef
JavaScriptPolyfillShim 在JavaScript中Shim和Polyfill有什麽區別?
世界 實現 blank spa 文章 target script 就是 新的 原文鏈接 在JavaScript的世界裏,有兩個詞經常被提到,那就是Shim和Polyfill,它們指的都是什麽,又有什麽區別?在本文中,將簡短的給大家介紹他們之間的聯系和區別。Shim一個shi
JavaScript 中 Property 和 Attribute 的區別詳解
sce 否則 遞歸 tro ole 條件 節點 記錄 could property 和 attribute非常容易混淆,兩個單詞的中文翻譯也都非常相近(property:屬性,attribute:特性),但實際上,二者是不同的東西,屬於不同的範疇。 property是DOM