1. 程式人生 > >JavaScript中的setter和getter方法!!

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>

記住以下幾點:

  1. 一個物件內,每個變數只能有一個getter或setter。(因此value可以有一個getter和一個setter,但是value絕沒有兩個getters)
  2. 刪除getter或setter的唯一方法是:delete object[name]。delete可以刪除一些常見的屬性,getters和setters。
  3. 如果使用__defineGetter__或__defineSetter__,它會重寫之前定義的相同名稱的getter或setter,甚至是屬性(property)。

平臺

支援的瀏覽器有:

Firefox

Safari 3+

Opera 9.5

相關推薦

JavaScriptsettergetter方法!!

javascript中的setter、getter是平時接觸比較少的方法,其本身也並不是標準方法,只在非ie瀏覽器裡支援(ie核心也許有其他方法可以做到呢?暫時不知其解),但是加以利用可以做許多事情,比如: 1、對資料的訪問限制: a.value是對value變數

iOS開發核心語言Objective C —— 面向對象思維、settergetter方法及點語法

才幹 各路 alt .net 行為 變量的作用域 fadein 格式 讀取 本分享是面向有意向從事iOS開發的夥伴們。或者已經從事了iOS的開發人員。假設您對iOS開發有極高的興趣,能夠與我一起探討iOS開發。一起學習,共同進步。假設您是零基礎,建議您先

javascriptencodeURIdecodeURI方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

JavaScriptcallapply方法的使用

acvaScript中的call()方法和apply()方法,在某些時候這兩個方法還確實是十分重要的。1. 每個函式都包含兩個非繼承而來的方法:call()方法和apply()方法。2. 相同點:這兩個方法的作用是一樣的。都是在特定的作用域中呼叫函式,等於設定函式體內this物件的值,以擴充函式賴以執行的作用

Swift開發筆記3.Swiftsettergetter的基本用法

Swift中有儲存屬性和計算屬性兩種。其中在計算屬性中可以實現setter和getter方法,我們在playground中定義兩個結構體: struct Point { var x = 0.0, y = 0.0 } struct Size { var wi

javascriptcall()apply()方法的區別

首先需要知道 call 和 apply 都是js 物件 prototype的方法 在使用的時候主要區別: var foo() = function(){ ....//程式碼段 } // foo.

【C#總結】settergetter方法 ToString方法

C#中方法名字都是大寫開頭的 String就是string的一個別名。String是.net框架中的,string是C#中的 屬性就是保護欄位的就是一些setter和getter方法 class Person { private Stri

玩轉Eclipse — 自動生成settergetter方法

        我們在程式開發過程中,往往要編寫這樣的類:類的部分或者全部屬性不希望讓外部世界直接訪問,而不用public欄位修飾。這樣,方法呼叫成了訪問這些屬性的唯一途徑。JavaBean就是一個很好的例子,其嚴格遵守面向物件的設計邏輯,所有屬性都是private。對於任

JavaScriptsetTimeout()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

javaScriptwindow物件的方法屬性

window物件是客戶端JavaScript最高層物件之一,只要開啟瀏覽器視窗,不管該視窗中是否有開啟的網頁,當遇到BODY、FRAMESET或FRAME元素時,都會自動建立window物件的例項。另外,該物件的例項也可由window.open()方法建立。

javascript陣列常用的方法屬性

前言 在javascript中,陣列是一種非常重要的資料型別,我們時常會和它打交道,最近在開發專案中頻繁的使用到陣列,但是自己對陣列的眾多方法已經是非常模糊了,為了方便自己以後能夠更好的使用陣列中的屬性和方法,在此記錄一下。 陣列常用的屬性和方法 常用屬性 Array.length:返回陣列的

JavaScriptStringJSON互換

轉為json 對象 沒有 解析 字符 hack json字符串 span rgb 最簡答的方式是:JSON.parse(obj) 將json對象解析為json字符串JSON.stringify(str) 將json字符串轉為json對象。需要註意的是早期的IE瀏覽器是沒有J

JavascriptinnerHTMLinnerText的區別

utf meta charset 測試 第一個 class utf-8 html標簽 技術分享 innerHTML:獲取的是從對象的起始位置到終止位置的全部內容,包括HTML標簽 innerText:獲取的是起始位置到終止位置的內容,但是會將HTML標簽去掉 下面寫一段代碼

javascripttypeofinstanceof

display eof 技術分享 style jpg ref ceo height play typeofjavascript中typeof和instanceof

JavaScriptNullundefind區別

cdc 如何 undefine 只有一個 som pre cnblogs 定義 報錯 公眾號原文 Javascript有5種基本類型:Boolean,Number,Null,Undefined,String;和一種復雜類型:Object(對象); undef

JavaScriptPolyfillShim 在JavaScriptShimPolyfill有什麽區別?

世界 實現 blank spa 文章 target script 就是 新的 原文鏈接 在JavaScript的世界裏,有兩個詞經常被提到,那就是Shim和Polyfill,它們指的都是什麽,又有什麽區別?在本文中,將簡短的給大家介紹他們之間的聯系和區別。Shim一個shi

JavaScript Property Attribute 的區別詳解

sce 否則 遞歸 tro ole 條件 節點 記錄 could property 和 attribute非常容易混淆,兩個單詞的中文翻譯也都非常相近(property:屬性,attribute:特性),但實際上,二者是不同的東西,屬於不同的範疇。 property是DOM