聊聊JavaScript中的对象——是对象,不是“对象”!(一)

102 阅读3分钟

众所周知,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;
    }

这样我们就可以正常访问我们定义的属性了。