对象创建模式与继承

方法一:object构造函数模式

套路:先创建空object对象,再动态添加属性/方法。
适用起始时不太确定对象内部数据
问题:语句太多

var p=new Object()
p.name='xmy'
p.age=19;
p.setName=function(name){
    this.name=name;
}

方法二:对象字面量模式

套路:使用{}创建对象,同时指定属性/方法
适用场景起始时对象内部数据是确定的
问题:如果创建多个对象,有重复代码

var p={
    name:'xmy',
    age:12,
    setName:function(name){
        this.name=name;
    }
}

方法三:工厂模式

套路:通过工厂函数动态创建对象并返回
适用场景需要创建多个对象
问题:对象没有一个具体的类型,都是object类型

function createPerson(name,age){//返回一个对象的函数==>工厂函数
    var obj={
        name=name,
        age=age,
        setName:function(name){
            this.name=name
        }
    }
    return obj
}

方法四:自定义构造函数类型

套路:自定义构造函数,通过new创建对象
适用场景需要创建多个类型确定的对象
问题:每个对象都有相同的数据,浪费内存

function person(name,age){
    this.name=name
    this.age=age
    this.setName=function(name){
        this.name=name
    }
}
var p1=new person('xmy',19)

方法五:构造函数+原型的组合模式

套路:自定义构造函数,属性在函数中初始化,方法添加到原型上
适用场景:需要创建多个类型确定的对象

function person(name,age){
    this.name=name
    this.age=age
}
person.prototype.setName=function(name){
    this.name=name
}
var p1=new person('xmy',19)

继承

原型链继承

1.定义父类型构造函数
2.给父类型的原型添加方法
3.定义子类型的构造函数
4.创建父类型的对象赋值给子类型的原型
5.将子类型原型的构造属性设置为子类型
6.给子类型原型添加方法
7.创建子类型的对象:可以调用父类型的方法
关键:子类型的原型为父类型的一个实例对象

//父类型
function Supper(){
    this.supProp='supper property'
}
Supper.prototype.showSupperProp=function(){
    console.log(this.supProp)
}

//子类型
function Sub(){
    this.subProp='Sub property'
}

//子函数的原型为父元素的一个实例对象
Sub.prototype=new Supper()
sub.prototype.constructor=Sub//让子类型的原型的constructor指向子类型
Sub.prototype.showSubProp=function(){
    console.log(this.subProp)
}

var sub=new Sub()
sub.showSupperProp()
sub.showSubProp()

27

借用构造函数继承

1.定义父类型的构造函数
2.定义子类型的构造函数
3.在子类型构造函数中调用父类型构造
关键:在子类型构造函数中用call()调用父类型构造函数

function person(name,age){
    this.name=name
    this.age=age
}
function student(name,age,price){
    person.call(this,name,age)//相当于this.person(name age)
    /*
      this.name=name
      this.age=age
    */
   this.price=price
}

var s=new student('xmy',19,10000000000)

组合继承

原型链+借用构造函数的组合继承
利用原型链实现对父类型对象的方法继承
利用super()借用父类型构建函数初始化相同属性

function person(name,age){
    this.name=name
    this.age=age
}
person.prototype.setName=function(name){
    this.name=name
}

function student(name,age,price){
    person.call(this,name,age)//为了得到属性
   this.price=price
}
student.prototype=new person()//为了能看拿到父类型的方法
student.prototype.constructor=student//修正constructor属性
student.prototype.setprice=function(price){
    this.price=price
}
var s=new student('xmy',19,10000000000)
s.setName('XMY')
s.setprice(16000000000)

Q.E.D.