马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 不二如是 于 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;
})();
这样就很像一个整体了,好了,开心的睡觉,迎接明天的新工作!
...
预知后事如何,请看 下回分解
课后作业
1、闭包函数有权访问另外一个函数作用域中的变量?(T/F)
答案:
如果有收获,别忘了评分 :
这位鱼油,如果喜欢JS-设计模式,请订阅 专辑☞( 传送门)( 不喜欢更要订阅 )
|