标签:ceo 表达 object 环境 创建 常用方法 另一个 tom 对象
闭包是指有权访问另一个函数作用域的变量的函数。
匿名函数的执行环境具有全局性。外围函数返回的匿名函数仅仅是定义,还尚未执行;函数内部的this对象指向函数据以执行的环境对象,当匿名函数被执行时,返回的匿名函数所处的执行环境是全局环境,故而this指向全局环境的变量对象。
var name = "Bob";
function out() {
var name = "Tom";
return function() {
return this.name;
}
}
alert(out()()); // Bob
如果function关键字是语句的开始,则这是一个函数声明。若要将函数声明转为函数表达式只需要用"()"括住函数声明即可。
任何在函数中定义的变量,都可以认为是私有变量。私有变量包括函数的参数、局部变量和函数内部定义的其他函数。
特权方法指有权访问私有变量和私有函数的公有方法。
创建私有变量的常用方法是构造函数模式:
function Test(name) {
var age = 24;
this.sayName = function() {
return name;
};
}
alert(new Test("Tom").sayName()); // Tom
alert(new Test("Tom").age); // undefined
构造函数内部的age、name是私有变量,不是实例变量(this.valueName),实例方法sayName是特权方法,能够访问name私有变量。
为了解决创建多个实例时会重复创建特权方法的问题,可以:
(function() {
var privateValue = 24;
function privateFunction() {
alert("Hello,world!");
}
// 用匿名构造函数初始化全局对象
Obj = function(){
};
Obj.prototype.publicMethod = function() {
alert(privateValue);
privateFunction();
};
})();
m = new Obj();
m.publicMethod();
模块模式是为单例创建私有变量和特权方法。
所谓单例,指的就是只有一个实例的对象。按照惯例,JavaScript以对象字面量来创建单例对象。
(function() {
var privateValue = 24;
function privateFunction() {
alert("Hello,world!");
}
return {
publicProperty: "public",
publicMethod: function() {
alert(privateValue);
privateFunction();
}
};
})().publicMethod();
增强模式返回的单例都是Object类型的,如果需要特定类型的单例,可以使用增强模块模式:
test = (function() {
var privateValue = 24;
function privateFunction() {
alert("Hello,world!");
}
Bob = new Student();
Bob.publicProperty = "public",
Bob.publicMethod = function() {
alert(privateValue);
privateFunction();
};
return Bob;
})();
function Student() {
}
test.publicMethod();
alert(test instanceof Student); // true
标签:ceo 表达 object 环境 创建 常用方法 另一个 tom 对象
原文地址:https://www.cnblogs.com/weixia-blog/p/9814022.html