原理:
在一个函数内部完成创建对象添加属性和方法。
缺陷:
无法识别对象的类型。
占内存,没有提取公共方法。
实例:
function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = createPerson("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor")
}
原理:
在构造函数中把属相添加给this。
使用new 操作符创建对象的过程 :
缺点:
5. 占内存,没有提取公共方法。
实例:
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
this.sayHi = function(){
alert('hi, i am '+ this.name)
}
}
var p1 = new Person('leo', 25, 'man');
p1.sayHi();
原理
function hasPrototypeProperty(object, name){
return !object.hasOwnProperty(name) && (name in object);
}
最常用的模式
原理:
在构造函数中私有定义属性;在原型中定义公共属性和方法。
为了解决 组合构造函数 构造函数和原型分开 的问题。
原理: 原型方法也放在构造函数内部;每次构建的时候判断原型是否含有某个原型方法 如果没有在声明。
function Person(name, age, job){
//属性
this.name = name;
this.age = age;
this.job = job;
// 方法
if (typeof this.sayName != "function"){
Person.prototype.sayName = function(){
alert(this.name);
};
}
}
var friend = new Person("Nicholas", 29, "Software Engineer");
friend.sayName();
注意:
使用动态原型模式时,不能使用对象字面量重写原型。
原理:
就是在工厂模式下 使用new 操作符。
使用情形:
这个模式可以在特殊的情况下用来为对象创建构造函数。假设我们想创建一个具有额外方法的特殊
数组。由于不能直接修改 Array 构造函数,因此可以使用这个模式
注意点:
构造函数返回的对象与在构造函数外部创建的对象没有什么不同。为此,
不能依赖 instanceof 操作符来确定对象类型。由于存在上述问题,我们建议在可以使用其他模式的情
况下,不要使用这种模式。
不使用 this 和 new 是完全封装的安全类型
function Person(name, age, job){
//创建要返回的对象
var o = new Object();
//可以在这里定义私有变量和函数
//添加方法
o.sayName = function(){
alert(name);
};
//返回对象
return o;
}
var friend = Person("Nicholas", 29, "Software Engineer");
friend.sayName(); //"Nicholas"
这样,变量 friend 中保存的是一个稳妥对象,而除了调用 sayName() 方法外,没有别的方式可
以访问其数据成员。