一、字面量方式创建对象
var obj = {
name:"admin",
age:18,
sex:"男",
sayHello:function(){
console.log(`大家好,我是${this.name},今年${this.age}岁`);
}
}
二、内置构造函数创建对象
var obj = new Object();
obj.name = "root";
obj.age = "20";
obj.sex = "男";
obj.sayHello = function(){
console.log(`大家好,我是${this.name},今年${this.age}岁`);
};
三、工厂模式创建对象
function createPerson(name,age,sex){
//原料
var person = {};
//加工
person.name = name;
person.age = age;
perdon.sex = sex;
person.sayHello = function(){
console.log(`大家好,我是${this.name},今年${this.age}岁`);
}
//出厂
return person;
}
var p1 = createPerson("anran",20,"女");
var p2 = createPerson("wuy",21,"男");
四、自定义构造函数创建对象
//自定义工厂模式被抛弃,因为javascript内置了工厂函数,称为自定义构造函数
function createPerson(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
this.sayHello = function(){
console.log(`大家好,我是${this.name},今年${this.age}岁`);
};
}
var p1 = new createPerson("anran",19,"女");
var p2 = new CreatePerson("wuy",20,"男");
//自定义构造函数的问题:当一个构造函数被多次new执行时,
//如果函数内部通过this设定了方法,那么多次new之后,会在内存中产生多个相同的方法,浪费内存,
console.log(p1.sayHello() == p2.sayHello());//false
五、原型创建对象
//将属性和方法都写在了原型对象上
function createPerson(){
createPerson.prototype.name = 'anran';
createPerson.prototype.age = '22';
createPerson.prototype.sex = '女';
createPerson.prototype.sayHello = function(){
console.log(`大家好,我是${this.name},今年${this.age}岁`);
}
}
五、混合模式(自定义构造函数+原型)创建对象
- 解决了自定义构造函数产生的问题
- 将将来的属性,写在构造函数内部,通过this绑定给将来的实例
- 将将来的方法,写在构造函数的原型上,会自动被将来的实例获取
- 方法共享,用new创建多个对象时,方法只有一个,不会浪费内存
function CreatePerson(){
this.name = "admin";
this.age = 19;
this.sex = "男";
}
CreatePerson.prototype.sayHello = function(){
console.log(`大家好,我是${this.name},今年${this.age}岁`);
}
var p1 = new CreatePerson();
var p2 = new CreatePerson();
console.log(p1.sayHello == p2.sayHello); //true