万物皆对象
面向对象中分了:对象和类的概念
什么是对象第一句话,想比大家都不陌生;我们重点来讨论什么是类!
对象是类的实例
类是对象的抽象
在代码中类好比是一个模板,用于批量生产,而且有共同的特征;
如何实现:
es5:混合模式:构造函数+原型模式(代码)
function People(name,age){//构造函数模式
this.name=name;
this.age=age;
}
People.prototype.study=function(){}//原型模式
es6 关键字class
class Student{
constructor(name){//构造器,构造函数
this.name = name;
this.age = 18;
console.log(666);
this.gender = "female";
}
say(){
console.log("hello");
}
}
得到一个模板类,如何用它,就需要new;
let stu1 = new Student ("小明")//Student {name: "小明", age: 18, gender: "female"}
这里我们在说说new它是如何操作的。
第一步:创建一个空对象o;
第二部:将该空对象的_proto_指向创建对象(Student)的原型prototype;
第三步:将创建对象的this环境指向该空对象,并执行代码;
第四步:将该空对象,返回变量;
代码:
obj1=(function(){
var o={};
o.__proto__=obj.prototype;
obj.call(o,"hello")
return o;
})();
面向对象三大特征
- 封装
隐藏内部细节,不暴露在外面;信息的隐藏;
具体就是对于属性和方法的封装; - 继承
子类继承父类的所有方法和属性,并且扩展自己的属性和行为。
如何实现:
es5:方法借用+原型继承。
方法借用
function Student(name,age,grand){
People.call(this,name,age);
this.grand=grand;
}
function foo(a,b){
console.log(this.name,a,b);
let zs={name:"张三"};
let ls={name:"李四"};
console.log(foo.call(zs,1,2));//张三 1 2
console.log(foo.apply(ls,[3,4]));//李四 3 4
let bar=foo.bind(zs);
console.log(bar(5,6));//张三 5 6
}
原型继承
Student.prototype=Object.create(People.prototype)
Object.create原理步骤:
第一步:创建一个空方法;
第二步:将该方法的prototype指向people原型;
第三步:返回该函数;
Object.create=function(People.prototype){
var o=function(){};//创建一个新函数
o.prototype=People.prototype;//将该函数原型等于people原型
return o();//返回该函数
}
- 多态
方法(行为)同的行为不同的实现
代码中的多态
重载
参数的不同,实现不同
js自带
重写
父亲的行为,儿子重写一个覆盖了
this指向
1.箭头函数没有自己的this,它借用声明环境中的this;
2.事件监听函数中,this指向绑定监听函数的那个元素节点(谁绑指向谁);
3.谁调用指向谁;
4.当一个函数没有被调用时,this指向全局window,全局模式下,this等于undefined;
5.面向对象new的时候,this指向新创建的空对象;
原型(prototype)
扩展:所有Function创建的函数,都叫做函数对象;
规则:
1.所有的函数对像都有一个原型对象(prototype);
2.所有的对象上都有一个隐式原型(proto),指向创建该对象的构造函数的原型(proyotype);
3.所有的原型对象身上都有一个constructr指向该原型所在的构造函数本身;
判断某个实例对象是否属于某个抽象类;必须是复杂数据类型;
实例instanceof类
原型链:
一个对象通过自身属性“——proto——”一直向上直到null所构成的链条就是我们的原型链;
作用
用来找属性,当一个对象在访问自身的属性xx时,会现在自己身上找,如果没找到,通过原型链——proto__层层向上找,直到找到为止,或者找完整个原型链都没有,那么就返回undefnd