第一种:通过 new Object 得到
var person = new Object();
person.name = "店小二";
person.age = 18;
person.say = function() {
//this,指向person对象所定义的属性
alert("我的名字是:"+this.name+",我今年"+this.age+"岁了");
}
person.say();
使用这种定义的方式,虽然可以定义一个对象,但是因为没有类的约束,所以无法实现对象的重复使用。
第二种:使用 json 得到
<span style="font-size:14px;"><span style="white-space:pre"> </span>var person = [{
name: "店小一",
age: 16,
sex: "男",
friends: ["店小二", "店小三"],
say: function() {
alert("名字:" + this.name + "\n年龄:" + this.age + "\n性别:" + this.sex + "\n朋友:" + this.friends);
}
},{
name: "店小二",
age: 16,
sex: "男",
friends: ["店小一", "店小三"],
say: function() {
alert("名字:" + this.name + "\n年龄:" + this.age + "\n性别:" + this.sex + "\n朋友:" + this.friends);
}
},{
name: "店小三",
age: 16,
sex: "男",
friends: ["店小一", "店小二"],
say: function() {
alert("名字:" + this.name + "\n年龄:" + this.age + "\n性别:" + this.sex + "\n朋友:" + this.friends);
}
}]</span>
同第一种方法一样缺点。
第三种:使用工厂模式得到
function creatPerson(name,age,sex) {
var Person=new Object;
Person.name=name;
Person.age=age;
Person.sex=sex;
Person.say=function(){
alert("名字:" + this.name + "\n年龄:" + this.age + "\n性别:" + this.sex)
}
return Person;
}
var p1 = creatPerson("店小二",12,"男");
p1.say();
alert(typeof p1);
使用工厂模式定义了对象,这样就很好的解决了对象无法重用的问题,但是此时又存在了另一个问题,就是无法判断
得到的对象的类型了,如 typeof 或者 instanceof来判断类型,仅仅得到一个 Object 类型。
第四种:使用构造函数来创建一个对象
function Person(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
this.say=function(){
alert("名字:" + this.name + "\n年龄:" + this.age + "\n性别:" + this.sex)
}
}
var p1= new Person("店小二",12,"男");
p1.say();
alert(p1 instanceof Person); //判断一个对象属于某个类,返回布尔值
基于构造函数的定义的方式最大的好处除了对象重复使用外,就是让我们还可以判断它的类型。
此时基于构造函数的定义对象的方式看似已经很完美了,需要的问题它都可以解决了,
但是却存在一个问。
通过代码分析得知:say 方法在每个对象创建后都存在了一个方法拷贝(但是我们发现代码在只有调用时,say 方法才会在堆中创建),这样就增加了内存的消耗了,如果在对象中有大量的方法时,内存的消耗就会高,这样不行了。
可以试着将方法写到构造函数外边,但是这样会带来另一个问题,就是方法一但定义为全局函数,那么 window 对象就可以调用该方法,这样就破坏了对象的封装性。