1.工厂模式
使用函数来封装创建对象的过程,每调用一次函数,return出一个包含指定属性和方法的新对象。
function createObject(attrValue){
var objTemp = new Object();
objTemp.attr = attrValue;
objTemp.getAttr = function(){
alert(this.attr);
};
return objTemp;
}
var obj = createObject(attrValue);
2.构造函数方法
function CreateObject(attrValue){
this.attr = attrValue;
this.getAttr = function(){
alert(this.attr);
};
}
var obj = new CreateObject(attrValue);
使用构造函数 new一个对象经历的几个步骤:
- 创建一个新对象
- 将新对象的原型指向构造函数的 prototype属性
- 将构造函数的作用域赋给新对象(将this指向新对象)
- 执行构造函数中的代码
- 返回新对象
3.原型模式
创建一个构造函数,在构造函数的 prototype属性上添加属性和方法。
function CreateObject(attrValue){
}
CreateObject.prototype.attr = attrValue;
CreateObject.prototype.getAttr = function(){
alert(this.attr);
};
var obj = new CreateObject();
创建一个构造函数,将构造函数的 prototype属性赋值为一个字面量形式创建的对象,并将其 constructor属性设置指向为构造函数本身。——此方法会导致 constructor的[[enumerable]]特性设置为 true
function CreateObject(attrValue){
}
CreateObject.prototype = {
constructor: CreateObject, // 将 constructor设为适当的值,纠正 constructor的指向
attr: attrValue,
getAttr: function(){
alert(this.attr);
}
};
var obj = new CreateObject();
【原型】
- 构造函数.prototype => 原型对象
- 原型对象.constructor => 构造函数
- 实例对象.__ proto__ => 原型对象 ([[prototype]]指针)
(Markdown编辑器对于前后有双下划线的内容设置为加粗文本,所以此处proto前面多了一个空格) - 实例对象 和 构造函数 没有直接关系
【原型判断的几种方式】
- 实例对象 instanceOf 构造函数 => true/false (模糊匹配)
- 原型对象.isPrototypeOf(实例对象) => true/false(模糊匹配)
- 实例对象.constructor => 构造函数 (精准匹配)
- Object.getPrototypeOf(实例对象) => 原型对象(精准匹配)
【对象属性判断】
- 实例对象.hasOwnPropertyOf(属性名) (实例属性)
- 属性名 in 实例对象 (只要在原型链上能访问到该属性即 true)
4.组合使用构造函数模式和原型模式
构造函数模式定义实例属性,原型模式定义方法和共享属性
function CreateObject(attrValue){
this.attr = attrValue;
}
CreateObject.prototype = {
constructor: CreateObject,
getAttr: function(){
alert(this.attr);
}
};
var obj = new CreateObject(attrValue);
5.动态原型模式
在构造函数内部,通过判断某方法是否存在,如果不存在的话,才在原型对象上添加该方法——判断的方式是使用typeOf this.fun != "function"
function CreateObject(attrValue){
this.attr = attrValue;
if(typeOf this.getAttr != 'function'){
CreateObject.prototype.getAttr = function(){
alert(this.attr);
};
}
}
var obj = new CreateObject(attrValue);
6.寄生构造函数模式
与工厂模式差不多,只不过需要使用 new操作符来以构造函数的形式创建对象。
return语句重写构造函数返回值,如果没有 return或者 return的不是一个对象,则还是默认返回 this对象
function CreateObject(attrValue){
var objTemp = new Object();
objTemp.attr = attrValue;
objTemp.getAttr = function(){
alert(this.attr);
};
return objTemp;
}
var obj = new CreateObject(attrValue);
7.稳妥构造函数模式
与寄生构造函数模式差不多,区别在于不设置公共属性,不需要使用 new操作符调用构造函数,且创建的对象实例方法不引用this,所以除了使用定义好的方法来获取创建对象时传入构造函数的原始数据,其他没有办法获取。
function CreateObject(attrValue){
var objTemp = new Object();
objTemp.getAttr = function(){
alert(attrValue);
};
return objTemp;
}
var obj = CreateObject(attrValue);