前端路线--JS高阶(day05)

类的创建

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		/*类的创建:1.类名首字母大写	
				   2.有constructor构造器
				   3.类的本质是函数
				   4.定义方法直接在类中写方法名,方法直接属于原型对象。
		  */
		class Person{
			//实例化对象
			constructor(name,age) {
			    this.name=name;
				this.age=age;
			}
			//原型方法
			say(x){
				console.log(this.name+',我在说话,'+x);
			}
		}
		var p1=new Person('小谷',10);
		console.log(p1);
		p1.say(10);
	</script>
</html>

新的继承方式

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
//------------------------------------------------------------------------------------------------
		//1.新的继承方式
		//父亲
		class Father{
			constructor(name,age) {
			    this.name=name;
				this.age=age;
			}
			say(){
				console.log('我调用了父亲的say');
			}
		}
		
		//孩子
		class Son extends Father{
			//无参的构造函数会自己生成
			sleep(){
				console.log('我在睡觉');
			}
		}
		var son1=new Son('小谷',10);
		son1.sleep();
		son1.say();
		console.log(son1);
		
		
		
//-------------------------------------------------------------------------------------------------
		//2.旧的继承方式
		function Father2 () {
			this.run=function(){
				console.log('父亲的跑步');
			}
		}
		function Son2(){
			//改变父亲的this指向
			Father2.call(this);
		}
		//继承的原型链
		Son2.prototype=new Father2();
		Son2.prototype.constructor=Son2;
		//孩子的原型对象的方法
		Son2.prototype.eat=function () {
				console.log('孩子吃东西');
			}
			
		var son2=new Son2();
		console.log('-------------');
		son2.run();
		son2.eat();
		console.log(son2);
	</script>
</html>

super关键字

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		//父亲
		class Father {
			constructor(name, age) {
				this.name = name;
				this.age = age;
			}
			play(){
				console.log('我在打孩子');
			}
			eat(){
				console.log('我吃的是父亲的食物');
			}
		}
		Father.prototype.shout='999';
		//孩子
		class Son extends Father {
			constructor(name, age, sex) {
				//super()  必须放在子构造器的第一行,用来调用父构造器
				super(name, age);
				this.sex = sex;
				//若想定义的方法不是属于其原型对象,则需要在其构造器中去定义
				this.study=function () {
					console.log('我是son自身的方法,是成员属性');
				}
			}
			say(){
				console.log('我是孩子的say方法,属于原型对象的');
				//调用父类的原型对象的方法
				super.play();
				console.log(super.shout);
			}
			eat(){
				console.log('我吃的是孩子的食物');
			}
		}
		var son = new Son('小好', 10, '女');
		son.study();
		son.say();
		//若子类和父类有相同的方法,则会执行子类的方法,即就近原则。
		son.eat();
		console.log(son);
		
		// super总结:
		/* 
		 1.必须放在子构造器的第一行,用来调用父构造器
		 2.若子类没有你声明构造器,系统会自己创建和调用无参的构造器
		 3.super只能调用父类的原型对象的属性(需要在类外用Father.prototype.属性名='值')和方法(定义在类里的constructor下的)
		 4.若子类和父类有相同的方法,则会执行子类的方法,即就近原则,可以重写父类的方法。
		 */
	</script>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值