继承(3)-闭包封装,属性私有化

提问

高大上的写法:

var inherit = (function(){
				var F = function(){};
				return function(Target,Origin){
					F.prototype = Origin.prototype;
					Target.prototype = new F();
					Target.prototype.constructor = Target;
				}
			}());

相当于:

var inherit = (function(){
				var F = function(){};
				function demo(Target,Origin){
					F.prototype = Origin.prototype;
					Target.prototype = new F();
					Target.prototype.constructor = Target;
				}
				return demo;
			}());

Return一个函数相当于return一个函数的引用。

闭包的作用第三点:实现封装,属性私有化。

如:

function Deng(name,wife){
				var prepareWife = "xiaozhang";
				this.name = name;
				this.wife = wife;
				this.divorce = function(){
						this.wife = prepareWife;
				}
				this.changePrepareWife = function (target){
					prepareWife = target;
				}
				this.sayPrepare = function (){
					console.log(prepareWife);
				}
			}
			var deng = new Deng("deng","xiaoliu");

有一天deng哥跟大媳妇小刘离婚了,离婚之后呢,有和小媳妇小张结婚了。

问题:deng哥离婚之后媳妇为什么会换成小张呢?

 

var prepareWife = "xiaozhang";这个变量是函数里面由于函数执行产生的执行期上下文里面的一个变量,函数执行完之后他是不是就被销毁了,那为什么还能用呢?

divorce = function(){this.wife = prepareWife;}这个方法在对象上,由于这个对象被返回,是不是这个方法也被返回了,所以这个方法他用这个变量是不是能行。

这个divorce是在外部执行的为什么能用人家内部的变量呢?

是不是闭包啊!这个函数被保存到了外部,所以他储存了这个函数的执行期上下文,

储存了执行期上下文,是不是咱就可以用这个闭包啊?
所以prepareWife这个变量是被divorce ,changePrepareWife,sayPrepare 这三个函数所共用的。这三个函数分别和Deng这个函数形成了闭包。所以这三个函数共同用Deng的Ao吧,所以他们在外部可以随意存取,

 

好了,现在有一天大媳妇小刘问你deng哥,你在外面是不是有人啊,,你deng哥说没有,不信你试试啊

 

,果然大媳妇小刘没有找到。

他真实的自己是不是能操作,所有的方法都能操作这个变量吧,但是你问他,我没有,并没有啊,所以这个变量他能用,表面上看并不是他自己的,但是这个闭包能紧跟着他,是个隐藏的区域,所以这个变量变的像他的私有化的变量似的,只有他自己能看到,别人看不到,所以这样的闭包的应用叫做私有化变量。

所以你想看到这个变量的话,你只能通过老deng的方法,比如说say这个方法,还得是他确实设置了这个方法,让你去看,让你去读,你才能知道吧,你想直接通过老deng你看不到。

 

 

那现在

return function(Target,Origin){
					F.prototype = Origin.prototype;
					Target.prototype = new F();
					Target.prototype.constructor = Target;
				}

这个过程是一个什么过程?

最后是不是变成了这样:

var inherit = function(Target,Origin){
					F.prototype = Origin.prototype;
					Target.prototype = new F();
					Target.prototype.constructor = Target;
				}

那现在这个F哪去了?是不是最后没有了,然而真的没有了吗?

是不是不是,形成闭包了吧,形成闭包之后他是不是成了这个函数的私有化变量了,

而var F = function(){};变成一个私有化变量是一个非常好的写法,因为本身这个F,

他用来就是过度一下的,根本就没有实际话的用途,所以咱们把他放在闭包里面,当作私有化变量,看起来是不是,写法上语义上更好。

猜你喜欢

转载自blog.csdn.net/hdq1745/article/details/83054954