一、Object()创建对象、用字面量的方式创建对象
1.Object()创建对象
new Object()就是利用JavaScript提供的构造函数实例化了一个对象
var person = new Object();
//为这个实例化的对象添加属性
person.name = "zhangsan";
person.age =21;
person.gender = 'male';
person.sayName = function(){
console.log(this.name)
}
2.用字面量的方式创建对象
var person = {
name: "zhangsan",
age: 18,
gender: 'male',
sayName: function(){
console.log(this.name);
}
}
缺点:以上两种方法在使用同一接口创建多个对象时,会产生大量重复代码,为了解决此问题,工厂模式被开发。
二、工厂模式创建对象
//将创建对象的代码封装在一个函数中
function createPerson(name, age, gender) {
var person = new Object();
person.name = name;
person.age = age;
person.gender = gender;
person.sayName = function () {
console.log(this.name);
}
return person;
}
//利用工厂函数来创建对象
var person1 = createPerson("zhangsan", 18, 'male');
var person2 = createPerson("lisi", 20, 'female');
优点:只要我们往工厂函数里面塞参数,工厂函数就会像生产产品一样造出实例来。
缺点:工厂模式解决了重复实例化多个对象的问题,但没有解决对象识别的问题(无从识别对象的类型,因为全部都是Object,本例中,得到的都是person对象,对象的类型都是Object)。
三、自定义构造函数模式
ECMAScript中的构造函数可以用来创建特定类型的对象。像Object和Array这样的原生构造函数,运行时可以直接在执行环境中使用。也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。
前面的案例使用构造函数可以这样写
// 自定义构造函数
function Person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
this.sayName = function () {
console.log(this.name);
}
}
var person1 = new Person('zhangsan', 29, 'male');
var person2 = new Person('lisi', 19, 'female');
person1.sayName(); // zhangsan
person2.sayName(); // lisi
注意:1、按照惯例,构造函数名称的首字母都是要大写的,非构造函数则以小写字母开头。这是从 面向对象编程语言那里借鉴的,有助于在 ECMAScript 中区分构造函数和普通函数。
2、任何函数,只要通过new操作符来调用,那它就可以作为构造函数;如果不用new操作符来调用,它就是一个普通函数的调用。比如,前面的案例中定义的 Person()可以像下面这样调用:
var Person = function (name, age, gender) {
this.name = name;
this.age = age;
this.gen