ES6(类、继承、Symbol)

目录

继承

1、子类对象指向父类对象

2、子类原型对象继承父类原型对象

Symbol

1、为了解决冲突

2、消除魔术字符串

3、全局注册表

Symbol.for(key) :创建的的symbol 会被放入一个全局symbol 注册表中。

Symbol.keyFor():检测symbol值是否在全局注册过,返回key或者Undefined。


类是构造函数的另一种写法

1、constructor方法是类的默认方法,通过new命令生成对象实例时自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。写在构造器里面的属性是实例的私有属性

2、写在类体里面的属性也是实例的私有属性

3、写在类体里面的方法是实例的公共方法(存放在原型对象中)

4、写在类体里面,通过static关键字来定义静态属性和静态方法,只能由类本身调用

总结:

实例使用属性和方法:私有属性(类构造器或类体非static)和公共方法(类体)

类本身去调用:静态属性和静态方法(类体static)

继承

class可以通过extends关键字实现继承,子类可以没有构造函数,系统会默认分配。子类提供了构造函数则必须要显式调用super。super函数类似于借用构造函数,类似于Animal.call

1、子类对象指向父类对象

子类实例可以调用父原型对象中的方法,子类原型对象有一个指针指向父类原型对象

2、子类原型对象继承父类原型对象

子类本身可以调用父静态方法和父静态属性,子类有一个指针指向父类

class Animal {

    constructor(name, age, weight) {

        // 实例的私有属性

        this.name = name;

        this.age = age;

        this.weight = weight;

        console.log('我是父构造器');

    }

    // 存放在原型对象中

    sayName() {

        console.log('我是父原型对象中的方法');

    }

    static attr = '我是父静态属性';

    static AnimalMethod() {

        console.log('我是父静态方法');

    }

};

class Dog extends Animal {

    constructor(name, age, weight, color) {

        // 使用super函数继承父类 先执行父构造器 在执行子构造器

        super(name, age, weight); //类似于 Animal.call(this)

        this.color = color;

        console.log('我是子构造器');

    };

};

let dog1 = new Dog('可乐', 1, '20kg', '白色');

console.log(dog1);

// 子类的原型对象继承父类的原型对象,子类实例可以调用父原型对象中的方法

dog1.sayName();

// 子类原型对象有一个指针指向父类原型对象

console.log(Dog.prototype.__proto__ === Animal.prototype);

// 子类继承自父类,子类本身可以调用父静态方法和父静态属性

Dog.AnimalMethod();

// 子类有一个指针指向父类

console.log(Dog.__proto__ === Animal);

console.log(Dog.attr);

class Animal {

    constructor(name, age, weight) {

        // 实例的私有属性

        this.name = name;

        this.age = age;

        this.weight = weight;

        console.log('我是父构造器');

    }

    // 存放在原型对象中

    sayName() {

        console.log('我是父原型对象中的方法');

    }

    static attr = '我是父静态属性';

    static AnimalMethod() {

        console.log('我是父静态方法');

    }

};

class Dog extends Animal {

    constructor(name, age, weight, color) {

        // 使用super函数继承父类 先执行父构造器 在执行子构造器

        super(name, age, weight); //类似于 Animal.call(this)

        this.color = color;

        console.log('我是子构造器');

    };

    sayName() {

        console.log('我是子类的原型对象中的方法');

    }

};

let dog1 = new Dog('可乐', 1, '20kg', '白色');

console.log(dog1);

// 优先调用子类的方法,子类没有时再调用父类的方法

dog1.sayName();

Symbol

ES6引入的一种新的原始数据类型Symbol,表示独一无二的值。Symbol函数可以接受参数,表示对于这个唯一值的描述。属于基本数据类型,Symbol()函数会返回Symbol类型的值。

let sy=Symbol('sy');

let sy1=Symbol('sy1');

console.log(sy===sy1,'判断sy和sy1是否相等');

console.log(sy,'打印sy');

console.log(sy1,'打印sy1');

console.log(typeof sy,'sy的数据类型');

1、为了解决冲突

let obj = {

    name: "zhangsan",

    age: 12,

}

// 新增属性,修改或者覆盖属性

obj.name = 'lisi';

console.log(obj);

新增属性,修改或者覆盖属性

let obj = {

    name: "zhangsan",

    age: 12,

    gender: "男",

};

let sy1 = Symbol('name');

obj[sy1]='liqian';

console.log(obj);

2、消除魔术字符串

魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一一个具体的字符串或者数值。

function test(params) {

    switch (params) {

        case 'one':

            console.log('这是one的操作');

            break;

        case 'two':

            console.log('这是two的操作');

            break;

        default:

            console.log('这是默认的操作');

            break;

    }

}

test('two')

当有一天要修改字符串two除了实参修改case语句也要修改所以形成魔术字符串

let obj = {

    attr1: Symbol('one'),

    attr2: Symbol('two'),

    attr3: Symbol('three'),

    attr4: Symbol('four'),

}

function test(params) {

    switch (params) {

        case obj.attr1:

            console.log('这是one的操作');

            break;

        case obj.attr2:

            console.log('这是two的操作');

            break;

        default:

            console.log('这是默认的操作');

            break;

    }

}

test(obj.attr1)

3、全局注册表

Symbol.for(key) :创建的的symbol 会被放入一个全局symbol 注册表中。

Symbol.for()并不是每次都会创建一个新的 sydbol,它会首先检查给定的 key是否已经在注册表中了。假如是,则会直接返回上次存储的那个。否则,它会再新建一个。

Symbol.keyFor():检测symbol值是否在全局注册过,返回key或者Undefined。

// 将symbol放到全局注册表中

let sy1=Symbol.for('hello');

// 从全局注册表中找到该key对应的value

let sy2=Symbol.for('hello');

console.log(sy1===sy2);

// 每次都会创建一个不同symbol值,虽然描述

符一样但是Symbold的value值不一样

let sy3=Symbol('hello');

let sy4=Symbol('hello');

console.log(sy3===sy4);

let result=Symbol.keyFor(sy1);

let result2=Symbol.keyFor(sy2);

let result3=Symbol.keyFor(sy3);

let result4=Symbol.keyFor(sy4);

console.log(result,result2,result3,result4);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值