1.对象的字面量
var obj = {};
2.创建实例对象
var obj = new Object();
obj.name = 'leon';
obj.age = '23';
obj.show = function(){
console.log(this.age);
}
3.通过构造函数构造对象
function fn(name,age){
this.name = name;
this.age = age;
this.show = function(){
console.log(this.age);
}
}
var men1 = new fn('leon','23');
var men2 = new fn('karen','22');
4.工厂模式
用一个函数,通过传递函数返回对象。
function createfn(name,age){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.show = function(){
console.log(this.age);
}
return obj;
}
createfn(leon,23);
这样可以一次创建多个不同的对象,但是需要注意的是,每个创建的对象都有不同的age属性,name属性,但是show在每个创建的对象的时候也会穿件一个新的方法模板,这样就会有点浪费内存了,可以这样改造一下。
function createfn(name,age){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.show = showName;
}
return obj;
}
function showName(){
console.log(this.name);
}
createfn(leon,23);
5.原型模式
function person() {};
person.prototype.name = 'leon';
person.prototype.age = '23';
person.prototype.show = function(){
console.log(this.age);
}
var men = new person();
console.log(men.name)
console.log(men.age)
每个创建的person对象都会自动拥有age name 属性和show 方法而且 这种写法有一个好处就是解决了show重复创建的问题,但是两个新问题也随之而来,无法使用构造器传递参数,如person(23,"leon"),更要命的是如果属性是引用类型的所有创建的对象都会持有同一个引用 ,如何解决这个问题?
6.混合模式 (原型模式+构造器)
function person(name,age){
this.age = age;
this.name = name;
this.array = new Array();
}
person.prototype.show =function(){
console.log(this.age);
}
7.动态原型方法
function person(age,name){
this.age=age;
this.name=name;
if(typeof person._initialized=='undefined'){
person.prototype.showName=function(){
console.log(this.age);
}
person._initialized=true;
}
}