问题:通过类可以创建多个具有相同属性和方法的对象,但ECMAScript中没有类的概念,怎样创建一个对象呢?
先看看JS里对象的定义
ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或函数”。对象的每个属性或方法都有一个名字,每个名字都映射到一个值,也就是所谓的key:value,其中value可以是数据或函数。
创建一个对象有好几种方法,比如:我想创建一个person对象,这个人的名字叫Tom,他今年20岁了,是一名教师~
1.最简单的方法:object构造函数方法
//创建一个object实例
var person=new object();
//为它添加属性
person.name="Tom";
person.age=20;
person.job="teacher";
//为它添加方法
person.sayName=function(){
console.log(this.name);
};
2.同样的对象,用对象字面量的语法可以写成这样
var person={
name : "Tom",
age: 20,
job : "teacher",
sayName : function(){
console.log(this.name);
}
}
//下面两行是测试的代码,可以忽略
person.sayName();//Tom
console.log(person.age);//20
注:上面两种方法虽然简单,但是有一个致命的缺点,你看出来了吗?
是的,他们可以用来创建单个对象,可是如果你想要很多类似的对象怎么办呢?比如说我想为班上的50个同学每个人都创建一个属于他们的对象,要是按照上面的方法一个一个写,估计我会累死的。而且代码很多都是重复的,只不过是换个值而已,没有一点技术含量更没效率。
解决方法来了!
3.仿照工厂模式创建对象:工厂模式抽象了创建具体对象的过程,我们也可以把创建对象的具体过程封装起来。用什么方法呢?函数!!!
(其实就是把方法1的代码放到函数里,让它变得更灵活)
function createPerson(name,age,job){
//创建一个object实例
var o=new object();
//为它添加属性
o.name=name;
o.age=age;
o.job=job;
//为它添加方法
o.sayName=function(){
console.log(this.name);
};
return o;//记着要把结果返回
}
现在你可以创建多个相似对象了,但是却没办法知道对象的类型,别着急,程序员的智慧是无穷的
4.用构造函数模式创建对象
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
console.log(this.name);
}
}
//为Tom创建对象
var person1=new Person("Tom",20,"teacher");
//为Tom的学生创建对象
var person1=new Person("Tommy",12,"student");
注:(1)在这种方法中,我们并没有用new操作符新建一个对象,实际上函数自己帮我们创建了一个对象,它的引用是this,this拿到了当前对象的地址,我们才能把属性添加到对象中去。