原文章 http://www.cnblogs.com/wangjq/p/3755691.html
Object构造函数
var person = new Object();
person.name="kevin";
person.age=31;
alert(person.name);
alert(person["name"])
对象字面量
var person =
{
name:"Kevin",
age:31,
5:"Test"
};
alert(person.name);
alert(person["5"]);</li>
工厂模式
返回带有属性和方法的person对象
function createPerson(name, age,job)
{
var o = new Object();
o.name=name;
o.age=31;
o.sayName=function()
{
alert(this.name);
};
return o;
}
createPerson("kevin",31,"se").sayName();
使用自定义构造函数模式
(这里注意命名规范,作为构造函数的函数首字母要大写,以区别其它函数,这种方式的缺陷:是sayName这个方法,它的每个实例都是指向不同的函数实例,而不是同一个)
function Person(name,age,job)
{
this.name=name;
this.age=age;
this.job=job;
this.sayName=function()
{
alert(this.name);
};
}
var person = new Person("kevin",31,"SE");
person.sayName();
使用原型模式
(解决了方法4中提到的缺陷,使不同的对象的函数(如sayFriends)指向了同一个函数。但它本身也有缺陷,就是实例共享了引用类型friends,从下面的代码执行结果可以看到,两个实例的friends的值是一样的,这可能不是我们所期望的)
function Person()
{
}
Person.prototype = {
constructor : Person,
name:"kevin",
age:31,
job:"SE",
friends:["Jams","Martin"],
sayFriends:function()
{
alert(this.friends);
}
};
var person1 = new Person();
person1.friends.push("Joe");
person1.sayFriends();//Jams,Martin,Joe
var person2 = new Person();
person2.sayFriends();//James,Martin,Joe
组合使用原型模式和构造函数
(解决了方法5中提到的缺陷,而且这也是使用最广泛、认同度最高的创建对象的方法)
function Person(name,age,job)
{
this.name=name;
this.age=age;
this.job=job;
this.friends=["Jams","Martin"];
}
Person.prototype.sayFriends=function()
{
alert(this.friends);
};
var person1 = new Person("kevin",31,"SE");
var person2 = new Person("Tom",30,"SE");
person1.friends.push("Joe");
person1.sayFriends();//Jams,Martin,Joe
person2.sayFriends();//Jams,Martin
动态原型模式
function Person(name,age,job)
{
//属性
this.name=name;
this.age=age;
this.job=job;
this.friends=["Jams","Martin"];
//方法
if(typeof this.sayName !="function")
{
Person.prototype.sayName=function()
{
alert(this.name);
};
Person.prototype.sayFriends=function()
{
alert(this.friends);
};
}
}
var person = new Person("kevin",31,"SE");
person.sayName();
person.sayFriends();