众所周知,JavaScript是面向对象的一门弱类型语言。面向对象语言其实就是面对的自己的对象编程,哈哈哈,开玩笑。
面向对象语言(Object-Oriented Language)缩写为OOP,是一类以对象作为基本程序结构单位的程序设计语言,指用于描述的设计是以对象为核心,而对象是程序运行时刻的基本成分,这也是为什么说JavaScript中,一切皆为对象。
既然是面向对象,其符合面向对象语言的一般特点,即封装、继承、多态。
封装:封装就是隐藏掉具体的内部实现细节,只向外部提供简单的接口。
继承:是一种能力,它可以使用现有的类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态:字面意思就是多种形态,具体来说就是去完成某个行为时,当不同的对象去完成时会体现出不同的形态。
简而言之,我们也可以大致这样理解:
封装:实现了代码的安全性;
继承:实现了代码的拓展性;
多台:实现了代码的灵活性;
封装
当我们选择创建一个类,去批量创建对象时,我们可以这样写:
class Person {
constructor(name){
this.name = name;
}
sayHello(){
console.log('你好',this.name);
}
}
const p1 = new Person('孙悟空');
const p2 = new Person('猪八戒');
const p3 = new Person('沙悟净');
p1.sayHello();
p2.sayHello();
p3.sayHello();
当我们想要更改其属性时,也非常简单,只需要加上p1.name = '唐僧'即可。
这样修改属性给我们带来方便的同时,也带来属性易被更改的安全隐患。
万一谁更改了你的属性,但你是真不想让你定义的这个对象属性被更改,而且极大可能还被改的啥也不是。因此,自己的命运要掌握在自己手里,自己定义的属性也要掌握在自己手里。
那么我们该怎么掌握在自己手里呢?
俗话说的好,私有财产神圣不可侵犯,我们将属性私有化就可以不被别人侵犯了咯。
在我们定义的属性前加上#,就可以实现把属性私有化。
class Person {
#name
constructor(name){
this.#name = name;
}
sayHello(){
console.log('你好',this.#name);
}
}
const p1 = new Person('孙悟空');
const p2 = new Person('猪八戒');
const p3 = new Person('沙悟净');
p1.name = '唐僧'
p1.sayHello();
p2.sayHello();
p3.sayHello();
这样别人就无法访问到你定义的私有化属性了,更别说改了。别人再想改,你就可以在心里想:哼,想改!没门!
可是别人哭着喊着要拿你的属性,一把鼻涕一把泪的,咋办?你还是心软了,想着:算了,既然你诚心诚意的求了,我还是大发慈悲的给你开个门吧(偷笑)。
getter() {
return this.#name;
}
setter(name) {
this.#name = name;
}
在类中,添加getter和setter方法,这样别人就可以访问到我们定义的属性了。
p1.setter('唐僧')
console.log(p1.getter());
但每次访问,还要调用方法,属实是不够优雅。我们还可以简化写成:
get name() {
return this.#name;
}
set name(name) {
this.#name = name;
}
这样我们就可以正常访问我们定义的属性了。