天天看点

构造函数,工厂函数,构造函数创建对象,new操作符都干了什么

工厂函数:

缺点: 函数识别问题

function createPerson(name,age,sex) {
    var o = new Object();
    o.name = name;
    o.age = age;
    o.sex = sex;
    o.sayName = function() {
        console.log(this.name)
    }
    return o;
}
           

构造函数创建对象(在es6之前是通过构造函数来创建对象的):

缺点: 创建不同对象其中属性和方法都会重复建立,消耗内存;

// 构造函数约定俗成的 第一个字母需要大写

// 构造函数本身也是函数,只不过可以用来创建对象

function Person (name,age,job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayname = function() {
        console.log(this.name)
    }
}

var person1 = new Person('zs',26,'man');
var person2 = new Person('ls',2,'woman');
console.log(person1);//Person { name: 'zs', age: 26, job: 'man', sayname: [Function] }
console.log(person2);//Person { name: 'ls', age: 2, job: 'woman', sayname: [Function] }
           

总结:

构造函数和工厂函数的的不同之处:

// 1、没有显示的创建对象。
     // 2、直接将方法和属性赋给了this对象。
     // 3、没有return语句。
           

new操作符干了什么(构造函数和new一起使用才有意义):

// 要创建Person的新实例,必须使用new操作符,这种方式调用构造函数,实际上会经历以下4个步骤。
  // 1、创建一个对象。
  // 2、将构造函数的作用域赋给新对象。(因此this就指向了这个新对象)。
  // 3、执行构造函数中的代码(为新对象添加属性)
  // 4、返回新对象
           
构造函数,工厂函数,构造函数创建对象,new操作符都干了什么
// person1 和 person2是Person不同的两个实例 两个对象都有一个constructor属性指向Person。
      console.log(person1.constructor == Person); //true
      console.log(person1.__proto__.constructor == Person); //true
      
      // 对象的constructor属性最初是用来标识对象类型 检测对象类型,用instanceof操作符
      
      // 创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型;
      // 而这正是构造函数模式胜过工厂模式的地方
      console.log(person1 instanceof Object); // true
      console.log(person1 instanceof Person); //true
           

工厂函数和构造函数都存在问题:工厂函数的问题构造函数来解决,构造函数的问题引入原型对象解决 传送门

继续阅读