1、Object.defineProperty
Object.defineProperty具體資料:傳送門
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> /*Object.defineProperty(obj, prop, descriptor)*/ /*可以定義方法*/ var obj={}; Object.defineProperty(obj,"newObj",{ value:function(p){} }); /*直接調用函數就會觸發value函數*/ /*可以定義屬性*/ var obj={}; Object.defineProperty(obj,"newObj",{ set:function(p){}, get:function(){} }); /*當obj.newObj="..."時會觸發set功能,賦值會以參數形式傳進函數,當obj.newObj會觸發get功能*/ /*value 和set、get共存*/ /*這個設置屬性和方法的方法可以設置雙向綁定功能,據說vue就是這樣實現的*/ </script> </body> </html>
2、修改某個數組實現監聽效果
今天遇到一個很神奇的代碼,就是使用數組push方法就可以實現發送數據到到后台
當時就郁悶了,一個數組的push方法就單純追加數據,沒有什么可以監聽數組變化而
觸發方法,因為代碼是別人寫的,而且因為某些原因無法一觀,所以不斷思考與嘗試
終於有結果了。
/*這是在單獨js文件里的*/ ;(function(){ /*_ncp自己定義的變量*/ if(!(_ncp instanceof Array)){ return ; } var arr=_ncp; function fn(){ Array.call(this); this.init(); } fn.prototype=new Array(); fn.prototype.init=function(){ for(var i=0;i<arr.length;i++){ this.oldPush(arr[i]); } } fn.prototype.oldPush=fn.prototype.push; fn.prototype.push=function(param){ this.oldPush(param); arr.push(param); /*模擬ajax*/ ajax(arr); } function ajax(p){ /*這里寫ajax*/ console.log(p); } _ncp=new fn(); })();
<script> var _ncp=_ncp||[]; var oScript=document.getElmentsByTagName("script")[0]; var create=document.createElement("script"); create.defer=true; create.ansyc=true; create.type="text/javascript"; create.src="js文件url地址"; oScript.parentNode.insertBefore(create,oScript); </script>
加載js文件