1. 创建对象的几种方式
    • Object() 构造函数创建 ```javascript var Person = new Object()

    Person.name = ‘Tom’ Person.age = 18

    1. - 对象字面量 {} 方式,适用于起始时,内部数据是确定的,缺点是创建多个对象进代码过于重复
    2. ```javascript
    3. var Person = {
    4. name: 'Tom',
    5. age: 18
    6. }
    • 工厂模式,通过工厂函数动态创建并返回,适用于创建多个同类型的对象;缺点是对象没有具体的类型,都是 Object 类型

      1. function createPerson(name, age) {
      2. var obj = {
      3. name: name,
      4. age: age
      5. }
      6. return obj
      7. }
    • 自定义构造函数,通过 new 关键字创建对象,适用于创建多个类型明确的对象;缺点是每个对象都有相同的数据,浪费内存空间 ```javascript function Person(name, age) { this.name = name this.age = age }

    var p1 = new Person(‘Tom’, 18)

    1. - 构造函数 + 原型方式,与上一个方法不同的是将共同使用的方法放到原型上面,在构造函数中只初始化一般数据
    2. ```javascript
    3. function Person(name, age) {
    4. this.name = name
    5. this.age = age
    6. }
    7. Person.prototype.say = function() {
    8. console.log(this.name + ' say hello')
    9. }
    10. var p1 = new Person('Tom', 18)
    11. p1.say()
    12. var p2 = new Person('andy', 20)
    13. p2.say()
    1. 继承模式
    • 原型链继承:将子类型的原型等于父类型的实例,这样做会改变实例对象的构造器指向,会指向父对象 ```javascript function Supper() {}

    function Sub() {}

    Sub.prototype = new Supper() // 重新指定构造器 Sub.prototype.constructor = Sub

    1. - 借用构造函数继承(此方式并不是真的继承),通过在子类型中使用 call() 方法调用父类型
    2. ```javascript
    3. function Person(name, age) {
    4. this.name = name
    5. this.age = age
    6. }
    7. function Student (name, age, number) {
    8. Person.call(this, name, age)
    9. this.number = number
    10. }
    • 组合继承:原型链 + 借用构造函数组合继承

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

    1. function Person(name, age) {
    2. this.name = name
    3. this.age = age
    4. }
    5. Person.prototype.sayName = function() {
    6. console.log('My name is ' + this.name)
    7. }
    8. function Student(name, age, number) {
    9. Person.call(this, name, age)
    10. this.number = number
    11. }
    12. Student.prototype = new Person()
    13. Student.prototype.constructor = Student
    14. Student.prototype.sayNumber = function() {
    15. console.log('Number: ' + this.number)
    16. }