创建对象方式和继承

Object构造函数模式

方法:先创建Object对象,再动态添加属性/方法

适用场景:起始时不确定对象内部数据

缺点:语句太多

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

对象字面量模式

方法:使用{}创建对象,同时制定属性、方法

适用场景:起始时对象内部数据是确定的

缺点:如果创建多个对象,有重复代码

var p = {
    name:'Tom',
    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;
        }
   }
}

自定义构造函数模式

方法:自定义构造函数,通过new创建对象

适用场景:需要创建多个类型确定的对象

缺点:每个对象都有相同的数据(方法,因此可以将方法放在原型上),浪费内存

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

继承

原型链继承

方法:

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

注意点:

子类型的原型为父类型的一个实例对象

function Super(){
    this.supProp = 'Supper property';
}

Super.prototype.showSupperProp = function(){
    console.log(this.supProp)
}

function Sub(){
    this.subProp = 'Sub property';
}
Sub.prototype.showSubProp = function(){
    console.log(this.subProp);
}

Sub.prototype = new Super();

Sub.prototype.constructor = Sub();

Sub.prototype.say = function(){
    console.log('say')
};

借用构造函数继承

  1. 定义父类型构造函数
  2. 定义子类型构造函数
  3. 在子类型构造函数中调用父类型构造

注意点:

在子类型构造函数中用call()调用父类型构造函数

function Person(name,age) {
        this.name = name;
        this.age = age;
    }

    function Student(name,age,address) {
        Person.call(this.name,age);
        this.price = address;
    }

    var st = new Student('da',20,'daf');
    console.log(st);

组合继承:

原型链 + 借用构造函数的组合继承

  1. 利用原型链实现对父类型对象方法的继承
  2. 利用call()借用父类型构造函数初始化相同属性
 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;
    Student.prototype.setPrice = function (price) {
        this.price = price;
    };

    var st = new Student('da',20,'daf');
    console.log(st);

你可能感兴趣的:(创建对象方式和继承)