国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript 模擬類機制及私有變量的方法及思路

2019-11-20 22:32:28
字體:
來源:轉載
供稿:網友
在使用一些 Javascript 框架時,或許會看到類似的代碼
復制代碼 代碼如下:

  var MyClass = new Class({
    initialize: function(param, ...) {
      this.param = param;
      ...
    },
    func1: function(...) {
      ...
    }
  });
  var myObj = new MyClass(param);
  myObj.func1(...);

這是一種典型的面向對象的類機制應用,與原生的 Javascript 類機制相比,顯得更為清晰和自然。并且,在此基礎上,實現類的繼承也較為方便。那么,這是如何實現的呢?
眾所周知,在 Javascript 中,將一個函數作為構造器,可以創建出一個對象,上面的代碼可以簡單的寫成:
復制代碼 代碼如下:

  function MyClass(param) {
    this.param = param;
    this.func1 = function(..) {
      ...
    };
  }
  var myObj = new MyClass(param);
  myObj.func1();

其實還是蠻簡單的,也不難理解。不過如果要構建一套大型的 Javascript 類庫,可能就會比較混亂,從一堆代碼中,要找出哪些是類,哪些是函數,哪些是類方法,哪些是類屬性,是一件痛苦的事。
當然,這里并不是要比較它們的優劣,只是好奇 new Class 的實現方式而已。
在上面的代碼中,使用 new MyClass() 這樣的語句,意味著 MyClass 必須是一個函數,同時也就意味著 new Class 需要返回一個函數對象,從字面的意思上可以看出,函數 initialize 是當做構造函數來使用的,所以,new Class 返回的函數中,必須使用 initialize 來對對象進行初始化。基于這樣的分析,可以得出以下代碼:
復制代碼 代碼如下:

  function Class(argu) {
    return function() {
      var init = argu['initialize'] || function() {};  //如果沒有構造函數 initialize,使用一個空函數作為默認構造函數
      for(var p in argu) {
        this[p] = argu[p];
      }
      init.apply(this, arguments); //使用當前函數的 this 來代替函數 initialize 原有的 this
    }
  }

上面的代碼并不夠嚴謹,但用來說明問題已經足夠了。需要注意 init.apply(this, arguments) 這一句,這里有幾個變量的指代,一個是 this,原本 initialize 中默認的 this,現在已被替代為返回的這個匿名函數的 this,而這個匿名函數,是通過 new Class 新建的自定義類的構造器。另外一個是 arguments,它指代的是匿名函數的參數,也就是上面的 new MyClass(param) 中的 param。
this 的轉換有些讓人頭暈,那么有沒有更為簡單的方法呢?請看下面的代碼:
復制代碼 代碼如下:

  function Class(argu) {
    var obj = argu['initialize'] || function() {};
    for(var p in argu) {
      obj.prototype[p] = argu[p]; //注意,這里用的是 prototype
    }
    return obj; // 其 主站蜘蛛池模板: 山阴县| 潮州市| 上饶市| 泽库县| 马关县| 历史| 怀柔区| 荥经县| 工布江达县| 屯门区| 隆德县| 自贡市| 彰化市| 贵港市| 剑川县| 阿拉善右旗| 绥德县| 延川县| 汕尾市| 潮安县| 沂源县| 武穴市| 泗洪县| 浙江省| 南涧| 琼海市| 宁陵县| 精河县| 寿光市| 库尔勒市| 什邡市| 富顺县| 彭州市| 大港区| 高邮市| 清涧县| 三明市| 雅江县| 望奎县| 乐业县| 安阳市|