不二如是 发表于 2018-6-28 14:26:51

007 ※ 偶遇看不见的#闭包

本帖最后由 不二如是 于 2018-6-28 14:26 编辑

关于为什么要学习JavaScript设计模式,请看:传送门



上一讲小不二利用JS语言特性,实现了对象共有/私有属性和方法,那种溢于言表的喜悦,无法用文字写出来。



正当小不二准备关电脑睡觉的时候,一个想法突然钻到他的脑子里:
咦,类的静态变量是不是就是通过闭包实现的呢?

PS:关于闭包的教程,鱼油可以参看:0 1 3 3 ★ 得“闭包”者得天下! | 【精英版】

理论上绝对可以通过类的静态变量实现闭包,小不二赶紧又打开编辑器:
var Book = (function(){
//       静态私有变量
      var bookNumber = 0;

//      静态私有方法
      function checkName(name){}

//      返回构造函数
      return function(newID,newName,newPrice){
//            私有变量
            var name,price;

//            私有方法
            function checkID(id){}
//                特权方法
                this.getName = function(){};
                this.setName = function(){};
                this.getPrice = function(){};
                this.setPrice = function(){};
               
//                公有属性
                this.id = newID;
//                公有方法
                this.copy = function(){};
               
                bookNumber++;
                if(bookNumber>100)
                  throw new Error("限量发售100本!");
                  
//                  构造器
                  this.setName(name);
                  this.setPrice(price);      
      }
    })();
   
    Book.prototype = {
//      静态公有属性
      isFishcBook : true,
//      静态公有方法
      display:function(){}
    };

闭包是有权访问另外一个函数作用域中变量的函数。

就是在一个函数内部创建另外一个函数。

我们将这个闭包作为创建对象的构造函数,这样它即是闭包又是可实例对象的函数。

这就意味着闭包可以访问到类函数作用域中的变量,如代码中的bookNumber变量。

它是一个静态私有变量,原本外面的函数是无法访问滴~

通过闭包,该变量即可被访问到。



整理完这个思路,小不二想到小甲鱼老师曾经说过:
闭包内部也可以实现一个完整的类,将访问到的属性和方法返回。

小不二将原本放在外面的prototype放到book()方法中:
var Book = (function () {
//       静态私有变量
      var bookNumber = 0;

//      静态私有方法
      function checkName(name) {
      }

//      创建类
      function book(newID, newName, newPrice) {
//            私有变量
            var name, price;

//            私有方法
            function checkID(id) {
            }

//                特权方法
            this.getName = function () {
            };
            this.setName = function () {
            };
            this.getPrice = function () {
            };
            this.setPrice = function () {
            };

//                公有属性
            this.id = newID;
//                公有方法
            this.copy = function () {
            };

            bookNumber++;
            if (bookNumber > 100)
                throw new Error("限量发售100本!");

//                  构造器
            this.setName(name);
            this.setPrice(price);
      }
//                构建原型
      _book.prototype = {
//      静态公有属性
            isFishcBook: true,
//      静态公有方法
            display: function () {
            }
      };
      return _book;
    })();

这样就很像一个整体了,好了,开心的睡觉,迎接明天的新工作!

...


预知后事如何,请看下回分解{:10_303:}



课后作业


1、闭包函数有权访问另外一个函数作用域中的变量?(T/F)



答案:
**** Hidden Message *****



如果有收获,别忘了评分{:10_281:} :

http://xxx.fishc.com/forum/201709/19/094516hku92k2g4kefz8ms.gif

这位鱼油,如果喜欢JS-设计模式,请订阅 专辑☞(传送门)(不喜欢更要订阅{:10_297:} )

http://xxx.fishc.com/forum/201803/21/151715umqz1qoywp11wjbq.gif

oujq2541 发表于 2018-7-26 11:31:35

我要看答案

TCY 发表于 2018-12-6 16:31:49

T

优时风 发表于 2020-6-21 18:28:04

T

jack6666 发表于 2022-10-21 20:35:18

1
页: [1]
查看完整版本: 007 ※ 偶遇看不见的#闭包