对象的创建模式

  • Object构造函数模式
    1. var obj = {};
    2. obj.name = 'Tom'
    3. obj.setName = function(name){this.name=name}
  • 对象字面量模式
    1. var obj = {
    2. name : 'Tom',
    3. setName : function(name){this.name = name}
    4. }
  • 构造函数模式
    1. function Person(name, age) {
    2. this.name = name;
    3. this.age = age;
    4. this.setName = function(name){this.name=name;};
    5. }
    6. new Person('tom', 12);
  • 构造函数+原型的组合模式
    1. function Person(name, age) {
    2. this.name = name;
    3. this.age = age;
    4. }
    5. Person.prototype.setName = function(name){this.name=name;};
    6. new Person('tom', 12);

继承模式

  • 原型链继承 : 得到方法
    1. function Parent(){}
    2. Parent.prototype.test = function(){};
    3. function Child(){}
    4. Child.prototype = new Parent(); // 子类型的原型指向父类型实例
    5. Child.prototype.constructor = Child
    6. var child = new Child(); //有test()
  • 借用构造函数 : 得到属性
    1. function Parent(xxx){this.xxx = xxx}
    2. Parent.prototype.test = function(){};
    3. function Child(xxx,yyy){
    4. Parent.call(this, xxx);//借用构造函数 this.Parent(xxx)
    5. }
    6. var child = new Child('a', 'b'); //child.xxx为'a', 但child没有test()
  • 组合
    1. function Parent(xxx){this.xxx = xxx}
    2. Parent.prototype.test = function(){};
    3. function Child(xxx,yyy){
    4. Parent.call(this, xxx);//借用构造函数 this.Parent(xxx)
    5. }
    6. Child.prototype = new Parent(); //得到test()
    7. var child = new Child(); //child.xxx为'a', 也有test()
  • new一个对象背后做了些什么?
    • 创建一个空对象
    • 给对象设置proto, 值为构造函数对象的prototype属性值 this.proto = Fn.prototype
    • 执行构造函数体(给对象添加属性/方法)