袁磊老师的课,ES6(三)

  • 一、对象
    对象是类的一个具体实例
const Person = {
	name :'张三',
	//等同于birth:birth
	birth,
	//等同于hello:function()...
	hello(){
	console.log('我的名字是:' , this.name);
}

}
  • 二、动态属性
let lastWord = 'last word';
const a = {
	'first word' : 'hello',
	[lastWord]:'world'
}
  • 三、class
    面向对象
    类的本质还是个方法
class Point{
	constructor(x,y){
	//构造函数,当创建一个对象实例的时候,要最先执行的函数,在类的内部,调用函数的属性的时候,要用this。
		this.x = x;
		this.y = y;
	}
	toString(){
		return '(' + this.x +',' + this.y +')';
}
}

构造函数的prototype属性,在ES6的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype属性上面。

  • 四、class的onstructor方法
class Point{ 
}
//等同于
class Point{
	constructor(){}
}

-五、class的继承
其实class并不能继承,还要用原型链的方式

class Point{    }

class ColorPoint extends Point{    }

语法演示

//super表示父类的构造函数
class Point{
	constructor(x,y){
		this.x = x;
		this.y  = y;
}
toString(){
	return'(' +  this.x + ',' + this.y +  ')'
}
}

- 练习1

 <script>
        class rect {
            constructor(w, h) {
                this.w = w;
                this.h = h;
                //在使用属性的时候,如果没this就不是属于这个实例的属性
                this.cname = "长方形";
            }
            zc() {
                console.log("zc: " + 2 * (this.w + this.h))
                // console.log("zc: "+ 2*(w+h))   这样写,不对!不加this就不事这个实例的
            }
            mj() {
                console.log("mj: " + this.w * this.h);
            }
        }

        let r1 = new rect(35, 78);
        let r2 = new rect(88, 10);
        r1.mj();
        r2.zc();
        console.log(rect.prototype == r1.__proto__);
        //定义一个类来继承
        class square extends rect {
            // 在ES6中的extends没有任何的深入效果,只不过是为了看的更清楚
            constructor(w) {
                super(w, w); //用super来调用父类的原型
                // this一定要在super之后调用
                this.cname = "正方形";
            }
        }
        // 定义两个正方形的实例
        let s1 = new square(66);
        let s2 = new square(30);
        s1.zc();
        s2.mj();
        // 进行一个扩展
        rect.prototype.say = function () {
            console.log(this.cname);
        }
        r1.say();
        s1.say();
        // 上面的运行结果表示可以被继承
        console.log(s1.__proto__ == square.prototype);
        // ES6里面不要写__proto__
        console.log(square.prototype.__proto__ == rect.prototype);
        // 介绍一种ES6独有的属性
        console.log(r1.hasOwnProperty("w"));
        // 有没有w这个自己的属性
        console.log(s1.hasOwnProperty("w"));
        console.log(s1.hasOwnProperty("h"));
        // s1也有父类的属性,h等于w而已。
        console.log(s1.h);
        console.log(s1.hasOwnProperty("mj"));//s1没有mj这个属性,因为mj是个方法

        


    </script>

在这里插入图片描述

  • 六、Symbol
    相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就成为静态方法。

独一无二的值。它是JavaScript语言的第七种类型,只要是Symbol生成的值,就 不可能重复。
由于每个Symbol的值都是不相等的,经常作为标识符,用于对象的属性名,就能保证不会出现同名的属性。

class Foo{
	static classMethod(){
	return 'hello';
    }

}

如果想获得同一个Symbol
使用Symbol.for
练习2

   <script>
        let s1 = Symbol(); //定义一个Symbol
        let s2 = Symbol();
        // s1和s2永远不可能相同,你就别管为啥了
        console.log(s1);
        console.log(typeof (s1));
        //你会发现,打印出来的Symbol你是看不到的,你只需要知道,这个值是不同的就阔以了!
        console.log(s1 == s2);

        let obj = {
            [s1]: "yuanlei",
            sx: "shuxingzhi"
        }
        console.log(obj[s1]);

        // 有时候我们需要获得同一个Symbol的
        var f1 = Symbol.for("foo");
        var f2 = Symbol.for("foo");
        console.log(f1 == f2);
        //用相同的键值生成的Symbol可以获取到相同的Symbol
        console.log(Symbol.keyFor); //我们来获得一个Symbol的key是什么,如果能够将这次的key进行保存,那么下次就可以用相同的Symbol了。
        
    </script>

在这里插入图片描述

Okay今天的笔记就到这里了,拜拜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值