这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战
前言
今天又是复习ES6知识点,今天差缺补漏私有变量,这也是重点哦,接下来我们来看一看吧。
私有变量
严格来讲,JavaScript 没有私有成员的概念,所有对象属性都公有的。不过,倒是有私有变量的概念。任何定义在函数或块中的变量,都可以认为是私有的,因为在这个函数或块的外部无法访问其中的变量。私有变量包括函数参数、局部变量,以及函数内部定义的其他函数。来看下面的例子:\
function add (numl, num2)
letsum=num1+num2;
return sum;
在这个函数中,函数add()有3个私有变量: num1、 num2 和sum。这几个变量只能在函数内部使用,不能在函数外部访问。如果这个函数中创建了一一个闭包, 则这个闭包能通过其作用城链访问其外部的这3个变量。基于这一点,就可以创建出能够访问私有变量的公有方法。
特权方法( privileged method )是能够访问函数私有变量( 及私有函数)的公有方法。在对象上有两种方式创建特权方法。第一种是 在构造函数中实现,比如:
这里的Person构造函数可以访问私有变量name,跟getName ()和setName()方法一样。 使种模式,name变成了静态变量,可供所有实例使用。这意味着在任何实例上调用setName ()修改变量都会影响其他实例。调用setName ()或创建新的Person实例都要把name变量设置为一个新而所有实例都会返回相同的值。
像这样创建静态私有变量可以利用原型更好地重用代码,只是每个实例没有了自己的私有变量终,到底是把私有变量放在实例中,还是作为静态私有变量,都需要根据自己的需求来确定。
注意使用闭包和私有变量会 导致作用域链变长,作用域链越长,则查找变量所需的时间也越多。
\
静态私有变量
特权方法也可以通过使用私有作用城定义私有变量和函数来实现。这个模式如下所示:帕里好( function() {\
//私有变量和私有函数
let privateVariable = 10;
function privateFunction() (
return false;
}
//构造函数
MyObject = function() { } ;
//公有和特权方法
MyObject . prototype . publicMethod = function() {
privateVariable++ ;
return privateFunction() ;
};
})();
在这个模式中,匿名函数表达式创建了一个包含构造函数及其方法的私有作用域。首先定义的是私有变量和私有函数,然后又定义了构造函数和公有方法。公有方法定义在构造函数的原型上,与典型的原型模式一一样。注意,这个模式定义的构造函数没有使用函数声明,使用的是函数表达式。函数声明会 创建内部函数,在这里并不是必需的。基于同样的原因(但操作相反),这里声明MyObject并没有使用任何关键字。因为不使用关键字声明的变量会创建在全局作用域中,所以MyObject变成了全局变量, 这个模式与前一-个模式的主要区别就是,私有变量和私有函数是由实例共享的。因为特权方法定义在原型上,所以同样是由实例共享的。特权方法作为一个闭包,始终引用着包含它的作用域。来看下面的例子:
( function() {
let name :
Person = function(value) (
name = value;
);
Person. prototype . getName = function() lreturn name
);
Person. prototype . setName = function(value) (
name = value;
);
})();
let person1 = new Person( 'Nicholas') ;
console. log (person1. getName()) ; // 'Nicholas '
person1. setName( 'Matt') ;
console. log (person1. getName());// 'Matt '
let person2 = new Person( 'Michael') ;
console. log (person1. getName()) ;11 'Michael 'console.1og (person2 ,getName()) ;// 'Michael
这里的Person构造函数可以访问私有变量name,跟getName ()和setName()方法一样。 使种模式,name变成了静态变量,可供所有实例使用。这意味着在任何实例上调用setName ()修改变量都会影响其他实例。调用setName ()或创建新的Person实例都要把name变量设置为一个新而所有实例都会返回相同的值。
像这样创建静态私有变量可以利用原型更好地重用代码,只是每个实例没有了自己的私有变量终,到底是把私有变量放在实例中,还是作为静态私有变量,都需要根据自己的需求来确定。
注意使用闭包和私有变量会 导致作用域链变长,作用域链越长,则查找变量所需的时间也越多。