鱼C论坛

 找回密码
 立即注册
查看: 2428|回复: 4

[庖丁解牛] 007 ※ 偶遇看不见的#闭包

[复制链接]
发表于 2018-6-28 14:26:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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




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

giphy.gif


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


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变量。

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

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

giphy.gif


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


小不二将原本放在外面的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;
    })();

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

...


预知后事如何,请看下回分解





课后作业


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



答案:
游客,如果您要查看本帖隐藏内容请回复





如果有收获,别忘了评分


                               
登录/注册后可看大图


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



                               
登录/注册后可看大图

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-26 11:31:35 | 显示全部楼层
我要看答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-6 16:31:49 | 显示全部楼层
T
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-21 18:28:04 | 显示全部楼层
T
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-21 20:35:18 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 15:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表