面向对象,全称为Object Oriented Programming ,缩写为OOP。
面向对象具有三大特征
封装、继承、多态
1.封装:内部运作隐藏在对象里面,只有基本功能暴露给用户。
2.继承:子类继承父类
3.多态:不同的对象可以共享相同方法
创建js对象的方法
1.普通模式
*var person=new Object();
person.name="a";
person.age=18;
person.sayHi=function(){
console(this.name);
}*
2.工厂模式
function person(name,age){
var p=new Object();
p.name=name;
p.age=age;
p.sayHi=function(){
console(this.name);
};
return p;
}
3.构造函数模式
function person(name,age){
this.name=name;
this.age=age;
this.sayHi=function(){
alert(this.name);};
}
var p1 = new person("a",18);
var p2 = new person("b",19);
p1.sayHi();
p2.sayHi();
4.原型模式
function person(name,age){
this.name=name;
this.age=age;
}
person.prototype.sayHi=function(){
alert(this,name);
}
var p1 = new person("a",18);
var p2 = new person("b",19);
p1.sayHi();
p2.sayHi();
原型对象
1、每个对象都有一个原型对象,可以通过_proto_属性来访问到对象的原型对象。
2、通过_proto_属性一直向上寻找原型对象的话,最终会找到null
3、构造函数的prototype属性指向一个对象,这个对象是该构造函数实例化出来的对象的原型对象。
4、js中的根对象是Object.prototype,Object.prototype对象是一个空对象。
5、js中的每一个对象,都是从Object.prototype对象克隆而来的。Object.prototype对象就是他们的原型对象,而Object.prototype对象的原型是null。
ES6新增的class
class CreatePerson{
constructor(){}
自定义方法名(){}
}
CreatePerson等价于构造函数的名字
constructor(){}等价于构造函数的函数体
自定义方法名(){}等价于绑定在构造函数原型上的方法
function CreatePerson(n,a){
this.name = n;
this.age = a;
}
CreatePerson.prototype.show = function(){
console.log(this.name + "---" + this.age);
}
等价于
class CreatePerson{
constructor(n,a){
this.name = n;
this.age = a;
}
show(){
console.log(this.name + "---" + this.age);
}
}
var p1 = new CreatePerson("admin",18)
p1.show();
prototype:专属于函数的一个属性,类型为对象,叫原型对象。
作用:为了给将来自身所在的构造函数被new出来的实例做父级使用的
proto:专属于对象数据的一个属性,类型为对象,叫隐式原型。
作用:找父级。
特性:
1.当某个对象自身不具有某个属性或方法时,会找父级
2.当这个对象是被new出来的实例时,这个对象的父级(proto)就是当前被new的这个构造函数的prototype
通过构造函数找到prototype,添加的属性或方法,在将来new出来的实例的父级身上都可以找到
构造函数的问题的解决方案:
在使用构造函数方式创建对象时:
将将来的属性,写在构造函数内部,通过this绑定给将来的实例。
将将来的方法,写在构造函数的原型上,会自动被将来的实例获取。