Javascript中建立函數的幾種方法

// 工廠函數模式
// 沒法解決對象識別問題
function person0(name, age, job) {
  var obj = new Object();
  obj.name = name;
  obj.age = age;
  obj.job = job;
  return obj;
}
// ---------------------------------------------------
// 構造函數模式
function Person(name, age, job) {
  this.name = name;
  this.age = age;
  this.job = job;
  // 這個方法實例化時,會建立兩次
  this.sayName = function() {
    alert(this.name);
  };
}

const person1 = new Person("test1", 19, "pig");
const person2 = new Person("test2", 19, "dog");

// ---------------------------------------------------
// 原型模式
// 初始化時沒法自定義屬性
function Person1() {}
Person1.prototype.name = "looyulong";
Person1.prototype.age = age;
Person1.prototype.job = job;
Person1.sayName = function() {
  alert(this.name);
};
// ---------------------------------------------------
// 組合構造函數模式
// 構造函數定義屬性,原型模式定義方法
function Per(name, age, job) {
  this.name = name;
  this.age = age;
  this.job = job;
}

Per.prototype = {
  constructor: Per,
  sayName: function() {
    alert(this.name);
  }
};

const per1 = new Per("test1", 19, "pig");
const per2 = new Per("test2", 19, "dog");

// ---------------------------------------------------
// 動態構造模式
// 就是加了一個判斷,判斷原型上面是否有對應的方法
function Person2(name, age, job) {
  this.name = name;
  this.age = age;
  this.job = job;
  if (typeof this.sayName !== "function") {
    Person2.prototype.sayName = function() {
      alert(this.name);
    };
  }
}

// ---------------------------------------------------
// 寄生構造函數模式
// 在構造函數的內部返回一個對象,也就是new的時候返回一個對象
// 與工廠函數其實沒有很大區別,只是在寫法上,工廠函數建立對象須要執行一個函數
// 經過這種模式,能夠達到和工廠函數相同的效果,可是倒是用new操做符調用的
function Person3(name, age, job) {
  var obj = new Object();
  obj.name = name;
  obj.age = age;
  obj.job = job;
  obj.sayName = function() {
    alert(this.name);
    alert(obj.name);
  };
  return obj;
}

// ---------------------------------------------------
// 穩妥構造函數模式
// 沒有公共屬性,沒有公共屬性,不用this
// 由於有些環境沒法是用this和new
function Person4(name, age, job) {
  var obj = new Object();
  obj.getName = function() {
    return name;
  };
  obj.getAge = function() {
    return age;
  };
  obj.getJob = function() {
    return job;
  };
  obj.sayName = function() {
    alert(name);
  };
  return obj;
}
相關文章
相關標籤/搜索