目录
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); | ![]() |