前端基础之《ECMAScript 6(4)—对象》

一、对象可以动态添加属性、函数(原有功能)

用.点运算符就能添加属性,函数也是直接定义。

    //声明一个对象
    let student = {};

    //添加属性和方法
    student.name = "小王";
    student.say = function(){
        console.log(this.name + "发言了");
    };

    //调用方法
    student.say();

    console.log(student);

二、简化对象写法

1、ES6允许在大括号里面,直接写入变量和函数,作为对象的属性和方法,这样的书写更加简洁。

let name = '张三';
let change = function(){
	console.log('开始学习了');
}

const school = {
	name,
	change,
	improve(){
		console.log('学习提高了');
	}
}

console.log(school);
school.improve();

2、对象内定义函数也简化了

以前是improve: function (){};

三、Symbol类型

1、ES6引入了一种新的原始数据类型Symbol。表示独一无二的值。它是JavaScript语言的第七种数据类型,是一种类似于字符串的数据类型。

2、Symbol特点

(1)Symbol的值是唯一的,用来解决命名冲突的问题。
(2)Symbol值不能与其他数据进行运算。
(3)Symbol定义的对象属性不能使用for...in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名。

3、Symbol创建

    //1. 使用Symbol()方法
    let s = Symbol();
    console.log(s, typeof s);

    let s2 = Symbol('张三');
    let s3 = Symbol('张三');
    console.log(s2 === s3);  //false

    //2. Symbol.for 创建
    let s4 = Symbol.for('张三');
    let s5 = Symbol.for('张三');
    console.log(s4 === s5);  //true

4、js数据类型小结

口诀:USONB
u:undefined
s:string  symbol
o:object
n:null  number
b:boolean

四、Symbol的作用

1、给对象添加属性和方法,表示独一无二的。

    //向对象中添加方法:up、down
    //但是我不知道game对象中是否已经有了up和down方法
    let game = {
        up: function() {
            console.log("向上1");
        },
        down: function() {
            console.log("向下1");
        },
        name: "俄罗斯方块"
    }

    //声明一个对象
    let methods = {
        up: Symbol(),
        down: Symbol()
    }

    game[methods.up] = function() {
        console.log("向上2");
    }
    game[methods.down] = function() {
        console.log("向下2");
    }

    console.log(game);

可以看到它原来有一个up()方法和down()方法,Symbol安全的给对象添加了方法。

2、[Symbol('描述符')],定义方法

    let youxi = {
        name: "狼人杀",
        [Symbol('say')]: function(){
            console.log("我可以发言");
        },
        [Symbol('zibao')]: function(){
            console.log("我可以自爆");
        }
    }

    console.log(youxi);

五、Symbol内置值

1、除了定义自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。
https://es6.ruanyifeng.com/#docs/symbol

2、Symbol.hasInstance

重写instanceof方法。

    //这个Person的class和构造函数是一样的,为了实例化对象而用的
	class Person{
        static [Symbol.hasInstance](param){
            //类似于重写instanceof方法,自己来实现
            console.log(param);
            console.log("我被用来检测类型了");
            return true;
        }
    }

    let o = {};

    console.log(o instanceof Person);  //true

3、Symbol.isConcatSpreadable

当我们使用concat()来合并数组的时候,通过这个属性的设置,来决定我们的这个值可不可以展开。

    const arr = [1,2,3];
    const arr2 = [4,5,6];
    //正常合并
    console.log(arr.concat(arr2));

    //设置Symbol.isConcatSpreadable
    arr2[Symbol.isConcatSpreadable] = false;  //不可展开
    console.log(arr.concat(arr2));  //arr2作为一个整体加入到了arr中

4、其余的属性都是来控制对象在特定场景下的表现

扩展对象功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值