Rumah hujung hadapan web tutorial js JavaScript 模拟类机制及私有变量的方法及思路_javascript技巧

JavaScript 模拟类机制及私有变量的方法及思路_javascript技巧

May 16, 2016 pm 05:29 PM

在使用一些 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; // 其實还是返回一個函數
  }

呵呵,感觉直白了许多。
这就完成了一个简单的类机制的构建。通过这种机制,可以创建类的构造函数、方法及属性,但这些显然都是公有的,那么,如何实现私有变量及方法呢?
我们知道,Javascript 类的私有变量可以通过闭包的机制来完成。但使用 new Class({...}) 的方式转换后,显然很难形成有效的闭包。如何绕过这个问题呢?
Javascript 提供了两个方法:eval() 及函数对象的 toString() 方法,前者较为常见,而后者,可用于获取函数的具体代码。通过这两个方法,可以简单的模拟类的私有变量:
复制代码 代码如下:

  function Class(argu) {
    var _ = argu['private'] || {};
    eval('var obj = ' + (argu['initialize'] || function() {}).toString());
    for(var p in argu) {
      if(p == 'initialize' || p == 'private')
        continue;
      if(typeof argu[p] == 'function')
        eval('obj.prototype[p] = ' + argu[p].toString());
      else
        obj.prototype[p] = argu[p];
    }
    return obj;
  }

通过函数对象的 toString() 方法提取出函数的代码,并使用 eval 方法执行这些代码,这样就可以构造出一个有效的闭包范围,从而实现私有机制。我们可以如下应用:
复制代码 代码如下:

  var Person = new Class({
    private: {
      height: 160,
      weight: 50
    },
    initialize: function(name, height, weight) {
      this.name = name;
      _.height = height || _.height;
      _.weight = weight || _.weight;
    },
    show: function() {
      alert('Name:' + this.name + '/nheight:' + _.height + '/nweight:' + _.weight);
    }
  });
  var my = new Person("Zh");
  my.show();

看起来不不错,不过在实际应用中,其实并没有太大的用途。主要是效率上,相比通常的实现方式,大概需要多花四倍的时间。在大型类库的构建上,这是不可容忍的,而小型的应用中,实现下面的代码更为简单直接:
复制代码 代码如下:

  function MyClass(param) {
    var privateVar = ...;
    this.param = param;
    this.func = function() {
      alert(privateVar);
    };
  }

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Ganti aksara rentetan dalam javascript Ganti aksara rentetan dalam javascript Mar 11, 2025 am 12:07 AM

Penjelasan terperinci mengenai kaedah penggantian rentetan javascript dan Soalan Lazim Artikel ini akan meneroka dua cara untuk menggantikan watak rentetan dalam JavaScript: Kod JavaScript dalaman dan HTML dalaman untuk laman web. Ganti rentetan di dalam kod JavaScript Cara yang paling langsung ialah menggunakan kaedah pengganti (): str = str.replace ("cari", "ganti"); Kaedah ini hanya menggantikan perlawanan pertama. Untuk menggantikan semua perlawanan, gunakan ungkapan biasa dan tambahkan bendera global g: str = str.replace (/fi

Bina Aplikasi Web Ajax anda sendiri Bina Aplikasi Web Ajax anda sendiri Mar 09, 2025 am 12:11 AM

Jadi di sini anda, bersedia untuk mempelajari semua perkara ini yang dipanggil Ajax. Tetapi, apa sebenarnya? Istilah Ajax merujuk kepada kumpulan teknologi longgar yang digunakan untuk membuat kandungan web yang dinamik dan interaktif. Istilah Ajax, yang asalnya dicipta oleh Jesse J

10 JQuery Fun and Games Plugin 10 JQuery Fun and Games Plugin Mar 08, 2025 am 12:42 AM

10 Plugin Permainan JQuery yang menyeronokkan untuk menjadikan laman web anda lebih menarik dan meningkatkan keletihan pengguna! Walaupun Flash masih merupakan perisian terbaik untuk membangunkan permainan web kasual, jQuery juga boleh menghasilkan kesan yang mengejutkan, dan walaupun tidak setanding dengan permainan flash aksi tulen, dalam beberapa kes, anda juga boleh bersenang -senang di penyemak imbas anda. permainan jquery tic toe "Hello World" pengaturcaraan permainan kini mempunyai versi jQuery. Kod sumber JQuery Game Composition Crazy Word Ini adalah permainan mengisi kosong, dan ia dapat menghasilkan beberapa hasil yang pelik kerana tidak mengetahui konteks perkataan. Kod sumber JQuery Mine Sweeping Game

Bagaimana saya membuat dan menerbitkan perpustakaan JavaScript saya sendiri? Bagaimana saya membuat dan menerbitkan perpustakaan JavaScript saya sendiri? Mar 18, 2025 pm 03:12 PM

Artikel membincangkan membuat, menerbitkan, dan mengekalkan perpustakaan JavaScript, memberi tumpuan kepada perancangan, pembangunan, ujian, dokumentasi, dan strategi promosi.

JQuery Parallax Tutorial - Latar Belakang Header Animasi JQuery Parallax Tutorial - Latar Belakang Header Animasi Mar 08, 2025 am 12:39 AM

Tutorial ini menunjukkan cara membuat kesan latar belakang paralaks yang menawan menggunakan jQuery. Kami akan membina sepanduk header dengan imej berlapis yang mewujudkan kedalaman visual yang menakjubkan. Plugin yang dikemas kini berfungsi dengan JQuery 1.6.4 dan kemudian. Muat turun

Bagaimanakah saya mengoptimumkan kod JavaScript untuk prestasi dalam penyemak imbas? Bagaimanakah saya mengoptimumkan kod JavaScript untuk prestasi dalam penyemak imbas? Mar 18, 2025 pm 03:14 PM

Artikel ini membincangkan strategi untuk mengoptimumkan prestasi JavaScript dalam pelayar, memberi tumpuan kepada mengurangkan masa pelaksanaan dan meminimumkan kesan pada kelajuan beban halaman.

Kandungan Div Refresh Auto Menggunakan JQuery dan Ajax Kandungan Div Refresh Auto Menggunakan JQuery dan Ajax Mar 08, 2025 am 12:58 AM

Artikel ini menunjukkan bagaimana untuk menyegarkan semula kandungan div secara automatik setiap 5 saat menggunakan jQuery dan Ajax. Contohnya mengambil dan memaparkan catatan blog terkini dari suapan RSS, bersama -sama dengan timestamp refresh terakhir. Imej pemuatan adalah opsyena

Bermula dengan Matter.js: Pengenalan Bermula dengan Matter.js: Pengenalan Mar 08, 2025 am 12:53 AM

Matter.js adalah enjin fizik badan tegar 2D yang ditulis dalam JavaScript. Perpustakaan ini dapat membantu anda dengan mudah mensimulasikan fizik 2D dalam penyemak imbas anda. Ia menyediakan banyak ciri, seperti keupayaan untuk mencipta badan yang tegar dan menetapkan sifat fizikal seperti jisim, kawasan, atau ketumpatan. Anda juga boleh mensimulasikan pelbagai jenis perlanggaran dan daya, seperti geseran graviti. Matter.js menyokong semua pelayar arus perdana. Di samping itu, ia sesuai untuk peranti mudah alih kerana ia mengesan sentuhan dan responsif. Semua ciri-ciri ini menjadikannya bernilai masa untuk belajar menggunakan enjin, kerana ini memudahkan untuk membuat permainan atau simulasi 2D berasaskan fizik. Dalam tutorial ini, saya akan merangkumi asas -asas perpustakaan ini, termasuk pemasangan dan penggunaannya, dan menyediakan

See all articles