定义一个class

// 定义class
class Student{
	constructor(name,number){
		// this指向当前构建的实例
		this.name=name
		this.number=number
		// this.gender='male'
	}
	sayHi(){
		// 在方法中可以使用this.获取某些属性
		console.log(
			`姓名 ${this.name},学号${this.number}`
		)
		// console.log(
		// 	'姓名'+this.name+',学号' + this.number
		// )
	}
}
继承:


// 通过类 new对象/实例
const dd=new Student('东东',100)
// console.log(ycd.name)
// console.log(ycd.number)
dd.sayHi();

继承父类class

// 父类
class People{
	constructor(name){
		this.name=name
	}
	eat(){
		console.log(`${this.name} eat something`)
	}
}
// 子类
class Student extends People{
	constructor(name,number){
		super(name);
		this.number=number
	}
	sayHi(){
		console.log(`姓名:${this.name},学号${this.number}`)
	}
}
// 子类
class Teacher extends People{
	constructor(name,marjor){
		super(name)
		this.marjor=marjor
	}
	teach(){
		console.log(`${this.name} 教授 ${this.marjor}`)
	}
}
const dd=new Student('东东',100);

const Wanglaoshi=new Teacher('王老师','语文')

dd.sayHi();
Wanglaoshi.teach();


// 类型判断 - instanceof
// instanceof 可以判断是否是引用类型

console.log(dd instanceof Student);  //true  这个实例Student不继承于object而是先继承的people
console.log(dd instanceof People);	 //true
console.log(dd instanceof Object); //true,object可以认为是任何一个class的父类
console.log(Wanglaoshi instanceof Student) //false
//[] instanceof Array  true
//[] instanceof Object true
//{} instanceof Object true

//class实际上是函数,可见是语法糖
console.log(typeof People) // 'function'
console.log(typeof Student) // 'funciton'

// 隐式原型:
console.log(dd.__proto__)
// 显示原型:
console.log(Student.prototype)
// 引用通同一个内存地址:
console.log(dd.__proto__ === Student.prototype);

// 总结:
// 1.每个class都有显示原型prototype
// 2.每个实例都有隐式原型__proto__
// 3.实例的__proto__指向对应class的prototype


// 基于原型的执行规则

// 获取属性dd.name或者执行方法dd.sayHi()时,
// 1.现在自身属性和方法中寻找
// 2.找不到就自动去隐式原型(__proto__)上查找

案例:实现一个简单jquery

class jQuery{
	constructor(selector){
		const result = document.querySelectorAll(selector)
		const length=result.length
		for(let i=0;i<length;i++){
			this[i]=result[i]
		}
		this.length=length;
		this.selector=selector;
		// 类数组形式,其实是个对象
	}
	get(index){
		return this[index]
	}
	each(fn){
		for(let i=0;i<this.length;i++){
			const elem=this[i]
			fn(elem)
		}
	}
	on(type,fn){
		return this.each(elem=>{
			elem.addEventListener(type,fn,false)
		})
	}
	//扩展其他api
}

//插件机制,直接往原型里添加方法
jQuery.prototype.dialog=function(info){
	alert(info);
}

// 复写机制(造轮子,继承)
class myJQuery extends jQuery {
	constructor(selector){
		// 继承父类的属性:
		super(selector)
	}
	//扩展自己方法...
	addClass(className){

	}
	style(data){

	}
}

调用方法:

<script src="./easy-jquery.js"></script>
<script>
	const $p=new jQuery('p');
	console.log($p)

	console.log($p.get(1));

	$p.each((elem)=>{
		console.log(elem)
	});

	$p.on('click',()=>{
		alert('clicked')
	});


	$p.dialog('调用插件方法');
</script>

  

12-18 04:10