zoukankan      html  css  js  c++  java
  • 谈javascript私有成员、静态方法和属性、常量

        在平常工作中大家都会默认用下划线来表示私有方法和属性:

    View Code
     1 var Book = function(isbn, title, author) { // implements Publication
     2   this.setIsbn(isbn);
     3 }
     4 Book.prototype = {
     5   _checkIsbn: function(isbn) {
     6     ...
     7   },     //公认的私有方法
     8   getIsbn: function() {
     9     return this._isbn;
    10   },
    11   setIsbn: function(isbn) {
    12     if(!this._checkIsbn(isbn)) throw new Error('Book: Invalid ISBN.');
    13     this._isbn = isbn;
    14   },
    15 };

       这种其实不是规范的私有成员,在javascript中,只要函数具有作用域,也就是说在一个函数内部定义的变量在函数外部无法访问,这也是私有成员的本质。利用这种技术,可以在js中定义私有成员,这里要用到的就是闭包:

    View Code
     1 function foo() {
     2   var a = 10;
     3 
     4   function bar() {
     5     a *= 2;
     6   }
     7    
     8   bar(); 
     9   return a;
    10 }

       前面所讲的作用域和闭包可以用来创建静态成员,包括公用和私有的,下面就是加了静态属性和方法的Book类:

    View Code
     1 var Book = (function() {
     2   
     3   // 私有静态属性
     4   var numOfBooks = 0;
     5 
     6   // Private static method.
     7   function checkIsbn(isbn) {
     8     ... 
     9   }    
    10 
    11   // 返回构造函数
    12   return function(newIsbn, newTitle, newAuthor) { // implements Publication
    13 
    14     // 私有属性
    15     var isbn, title, author;
    16 
    17     // 特权方法
    18     this.getIsbn = function() {
    19       return isbn;
    20     };
    21     this.setIsbn = function(newIsbn) {
    22       if(!checkIsbn(newIsbn)) throw new Error('Book: Invalid ISBN.');
    23       isbn = newIsbn;
    24     };
    25 
    26     this.getTitle = function() {
    27       return title;
    28     };
    29     this.setTitle = function(newTitle) {
    30       title = newTitle || 'No title specified';
    31     };
    32 
    33     this.getAuthor = function() {
    34       return author;
    35     };
    36     this.setAuthor = function(newAuthor) {
    37       author = newAuthor || 'No author specified';
    38     };
    39 
    40     // Constructor code.
    41     numOfBooks++; // Keep track of how many Books have been instantiated
    42                   // with the private static attribute.
    43     if(numOfBooks > 50) throw new Error('Book: Only 50 instances of Book can be '
    44         + 'created.');
    45 
    46     this.setIsbn(newIsbn);
    47     this.setTitle(newTitle);
    48     this.setAuthor(newAuthor);
    49   }
    50 })();
    51 
    52 // 公用静态方法
    53 Book.convertToTitleCase = function(inputString) {
    54   ...
    55 };
    56 
    57 // 公用无特权方法.
    58 Book.prototype = {
    59   display: function() {
    60     ...
    61   }
    62 };
  • 相关阅读:
    体检套餐管理系统
    Altium Designer9.4局域网内冲突的问题
    关于ARM Linux下的SD卡及U盘的挂载问题
    mkimage command not found – U-Boot images will not be built
    Xilinx------BUFG,IBUFG,BUFGP,IBUFGDS等含义以及使用
    linux文件压缩解压命令
    VIVADO 入门之仿真与逻辑分析仪使用
    Linux自动运行应用程序
    ZYNQ学习之二-EMIO
    inux grep 命令 搜索含有"zynq"字符的文件
  • 原文地址:https://www.cnblogs.com/55555azhe/p/2874290.html
Copyright © 2011-2022 走看看