什么是特权方法嘞:
就是有权访问私有变量,私有函数的公有方法就是特权方法(privileged method)
有两种方法用来创建特权方法:
1.在构造函数中定义特权方法
2.另一个就是通过私有作用域中定义私有变量或私有函数,创建特权方法。
首先第一种:
function Myobject(){
//私有变量,私有函数
var privateVariable=10;
function privateFunction() {
return false;
}
//特权方法
this.privateMethod=function () {
privateVariable++;
return privateFunction();
}
}
在这个函数外面不能通过其他方法来直接访问privateVariable和privateFunction()。但是用定义的privateMethod方法就可以了。那个方法就是特权方法了,能够在构造函数中定义特权方法,是因为特权方法座位闭包有权访问在构造函数中定义的所有的变量和函数。利用特权方法可以用来隐藏那些不应该别直接访问,修改的数据。
注意:
在构造函数中定义特权方法也有一个缺点,就是你必须要用构造函数模式来达到目的,而构造函数模式的缺点就是每个实例都会创建同样的一组新方法。这个缺点在创建对象的时候也出现了。
第二种:
下面就是使用静态私有变量来实现特权方法。
(function(){
//私有变量,私有函数
var privatevar=10;
function privateFunction() {
return false;
}
//构造函数
MyObject=function () {
}
//特权方法
MyObject.prototype.publicMethod=function () {
privatevar++;
return privateFunction()
}
})();
首先是利用自运行函数创建了一个私有作用域,在其中定义了私有的变量和私有的函数,后面定义了一个构造函数和公有方法。公有方法是在原型上定义的。首先要注意的是定义构造函数的时候用的是函数表达式(函数声明值创建局部的函数)并且没有用var来声明,这样的话就是一个全局的变量,可以在私有作用域之外访问。
两者之间的区别:
要知道的第二种方法是私有变量和私有函数由实例共享,特权方法定义在原型上,所以说所有实例都是使用一个函数。不过两者都是闭包哦。
我们再来看看下面的例子:
(function () {
var name="";
Person=function (value) {
name=value;
};
Person.prototype.getName=function () {
return name;
};
Person.prototype.setName=function (value) {
name=value;
}
})();
这个是里面定义了一个私有的变量,一个构造函数,在函数的原型上写了两个特权方法,如果说你进行下面的调用:
var person1=new Person("yc");
alert(person1.getName());
person1.setName("yc222");
alert(person1.getName());
var person2=new Person("yycc");
alert(person2.getName());
alert(person1.getName());
那么结果是什么那?。你可以自行运行一下。其中的name是静态的,所有实例共享的属性。上面的因为在原型上声明,所以说所有的修改都会体现在实例中。用这样方式会因为使用原型而增进代码的复用,但是所有的实例都是没有自己的私有变量的,所以各有各的好处,问题就取决于你的需求了。
之前一直装作帅气小哥哥,不过好像也没吸粉,可来我还是好好的些技术文吧