1. 程式人生 > >js監聽一個變數的變化

js監聽一個變數的變化

監聽一個變數的變化

目前主流的前端框架(例如:react、vue)都有的共同特點是資料繫結,他們通過對一個變數的監聽,來實現變數變化時候的動態響應。當網頁中的資料發生了變化,便立即呼叫相關的回撥函式來更變dom節點中的內容,來實現資料檢視的更新。

在智庫這個專案中,由於種種原因,我們並沒有用react和vue等框架,所以我們就需要使用其他的方法來實現資料流的繫結。

現在常用的資料繫結的方式有很多比如說ES5的getter和setter、髒數值檢查以及ES6中的proxy,在專案中我們用到的是ES5的getter和setter

ES5的getter和setter

在ES5中,有一個Object.defineProperty

的方法,這個方法可以直接在物件上建立一個新屬性或者修改已經存在的屬性。

來自MDN的官方文件
Object.defineProperty(obj, prop, descriptor)
引數
obj
要在其上定義屬性的物件。
prop
要定義或修改的屬性的名稱。
descriptor
將被定義或修改的屬性描述符。

我們會發現屬性描述符有一下幾種:
屬性描述
其中,get和set的描述就是我們現在需要對物件繫結的方法,這兩個屬性就像是對這個物件的某一個鍵名的監聽,當我們讀取這個鍵名的時候,會自動呼叫get方法,當我們改寫set的時候,會自動呼叫set

下面我們來一個例項:

var obj={};
Object.defineProperty(obj,'data',{
    get:function(){
        return data;
    },
    set:function(newValue){
        data=newValue;
        console.log('set :',newValue);
        //需要觸發的渲染函式可以寫在這...
    }
})

這樣,當我們給obj的data賦值的時候,就會觸發set 的方法

    obj.data=1;//set: 1

這樣,在每次更改數值的時候,我們無需手動多次呼叫渲染函式,只需要在defineProporty

中呼叫一次即可。

同時,如果你想一下子定義多個變數的getter和setter,你可以使用Object.defineProperties(obj,props)

引數
obj
要在其上定義屬性的物件。
props
要定義其可列舉屬性或修改的屬性描述符的物件。

話不多說,直接上程式碼:

    var obj = {};
Object.defineProperties(obj, {
    a: {
        configurable: true,
        get: function() {
            console.log('get: ',a)
            return a
        },
        set: function(newValue) {
            a = newValue;
            console.log('set: ',a)
        }
    },
    b: {
        configurable: true,
        get: function() {
            console.log('get: ',b)
            return b;
        },
        set: function(newValue) {
            b = newValue;
            console.log('set: ',b)
        }
    }
})

相關推薦

js一個變數變化

監聽一個變數的變化 目前主流的前端框架(例如:react、vue)都有的共同特點是資料繫結,他們通過對一個變數的監聽,來實現變數變化時候的動態響應。當網頁中的資料發生了變化,便立即呼叫相關的回撥函式來更變dom節點中的內容,來實現資料檢視的更新。 在智庫這個

node.js文件變化

user 參考 正在 ron sda 更多 for 滿足 log 前言 隨著前端技術的飛速發展,前端開發也從原始的刀耕火種,向著工程化效率化的方向發展。在各種開發框架之外,打包編譯等技術也是層出不窮,開發體驗也是越來越好。例如HMR,讓我們的更新可以即時可見,告別了手動F5

js input變化

chang rop for dds prop class brush input pre $(document).on(‘input propertychange‘, ‘#addShop .form-control‘, function() {   if($(this).

js某個元素高度變化來改變父級iframe的高度

key ava target splice call string case 改變 實例 最近需要做一個iframe調用其他頁面內容,這個iframe地址是可變化的,但是裏面的內容高度不確定且裏面內容高度可調整,所以需要通過監聽iframe裏面body的高度變化來調整ifr

js視窗變化動態改變div大小

js監聽視窗變化動態改變div大小 function getHeight(val) { this.processHeight=(window.innerHeight || document.documentElement.clientHeigh)-210 +'px';

js輸入框內容變化事件

如果你在實現“統計input、textarea文字框輸入字數”中遇到問題,閱讀本文或許可以幫助你解決這個棘手的問題! 手機頁面開發,要統計textareal文字框輸入字數,使用onkeyup雖然可以監聽到輸入框的文字字數變化,但在iphone下有個問題:

vue中判斷伺服器傳遞的資料是否存在 即 vue一個不存在的變數

如果在專案中的某個方法中判斷伺服器端傳來的資料是否存在可以 採用 typeof 屬性 ==  "undefined" 判斷 例如 : <div v-for="(item,index) in testData" :key="index"> <div :cla

JS-整個頁面上的DOM樹變化

# [線上預覽](https://jsfiddle.net/1010543618/fyf913t0/) ## 方法 - 使用《Web API 介面》的《MutationObserver》 [MutationObserver](https://developer.mozilla.org/zh-CN/docs/W

jstextarea 內容的變化,並計算內容的長度

監聽textarea 內容變化:HTML5標準事件 oninput 和 IE 專屬事件 onpropertychange 事件來監聽輸入框值變化 html程式碼如下: <div class

js輸入框值的即時變化onpropertychange、oninput、onchange

要達到的效果很多情況下我們都會即時監聽輸入框值的變化,以便作出即時動作去引導瀏覽者增強網站的使用者體驗感。比如即時顯示輸入框已經被輸入的位元組數,或者即時讀取輸入的值來進行搜尋引導,也就是google的關聯搜尋效果等。 只要我們能捕獲即時事件就能做到很多事情。 需要了解的知

js控制元素顯示在螢幕固定位置,螢幕高度變化

//控制logo的顯示位置 Begin window.addEventListener("resize", function () { // 得到螢幕尺寸 (內部/外部寬度,內部/外部高度) changeLog

Android與JS互動,url實時變化的方法.

private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view,

JS 隱藏域值變化

在開發中,遇到一個問題,需要監聽頁面隱藏域值變化,但是試了好幾種方式也不好用,最後發現可以再改動隱藏域值的時候,手動呼叫下.onchang() 事件。 $('#imgUrlTemp').val("111");$("#imgUrlTemp").change(); $('#imgUrlTemp').chan

jstextarea 內容的變化,並計算內容的長度c

fix head con window class keyword -m rfi val html代碼如下: <div class="customer-message">

鍵盤frame變化

sub observe div 彈出 cga inf style chang cati /** * 監聽鍵盤的彈出和隱藏 */ - (void)keyboardWillChangeFrame:(NSNotification *)note { // 鍵盤最終的f

vue17 $watch 數據變化

itl lac imu src 變化 .com cti style ctype <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> &

Javascript----input事件實現動態textarea內容變化

span oninput idt ava ntb ima property onchange pre 1、代碼 <!DOCTYPE html> <html> <head> <title>textarea輸入文字監聽

JScheckbox的選擇獲取取消事件代碼案列

事件 onclick att 選中 types bsp put color type function OncheckBox(index){ if ($(index).attr("checked") == "checked") { alert($(ind

JS頁面滾動到底部事件

his div span 頁面 == nbsp scroll win cnblogs 廢話不說,直接上代碼,放心我這個是最好的,直接放到js腳本裏,直接生效: $(window).scroll(function(){ var scrollTo

js 後退事件及跳轉頁面

gpo post script log push pan rip var pre //直接跳轉 window.location.href="b.html"; //返回上一級頁面 window.history.back(-1); //返回下一級頁面 window.his