天天看點

構造函數,工廠函數,構造函數建立對象,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
           

工廠函數和構造函數都存在問題:工廠函數的問題構造函數來解決,構造函數的問題引入原型對象解決 傳送門

繼續閱讀