工厂模式
- 调用 Fun1 不用关键字 new
- 创建对象时可以带参
- Fun1 里生成一个对象, 并返回该对象
- 参数存在 obj1 本身
- 实例化对象改变属性值后, 相互不影响
- 相当于实例化时在 obj1 本身创建参数, 方法
function Fun1(value1, value2, value3) {
var _obj = new Object();
_obj.value1 = value1;
_obj.value2 = value2;
_obj.value3 = value3;
_obj.fun1 = function() {
// this 指向 _obj
console.log(this.value1);
}
return _obj;
}
var obj1 = Fun1("value1", "value2", "value3");
构造函数模式
- 用关键字 new 调用 Fun2
- 创建对象时可以带参
- Fun2 把数据挂在本身的 this 上, 不返回内容
- 参数存在 obj2 本身
- 实例化对象改变属性值后, 相互不影响
- 相当于实例化时在 obj2 本身创建参数, 方法(以 obj2 作为 this, 执行方法 Fun2)
- 构造函数中不应 return 对象, 否则会覆盖 this
- 实际上并不存在所谓的“构造函数”,只有对于函数的“构造调用”1
function Fun2(value1, value2, value3) {
this.value1 = value1;
this.value2 = value2;
this.value3 = value3;
this.fun1 = function() {
// this 指向 Fun2
console.log(this.value1);
}
}
var obj2 = new Fun2("value1", "value2", "value3");
原型模式
- 用关键字 new 调用 Fun3
- 创建对象时不能带参
- Fun3 把数据挂在原型 prototype 上, 不返回内容
- 参数存在 obj3 的原型链上 obj3.__proto__
- 实例化对象改变属性值后, 相互影响
- 相当于实例化时把参数, 方法继承下来
function Fun3() {}
Fun3.prototype.value1 = "value1";
Fun3.prototype.value2 = "value2";
Fun3.prototype.value3 = "value3";
Fun3.prototype.fun1 = function() {
// this 指向 Fun3
console.log(this.value1);
};
var obj3 = new Fun3();
//end
出自《你不知道的JavaScript》 ↩︎