一,创建对象的方式有哪些?
1.创建单个对象
字面量 var obj={}
构造函数 var obj=new Object()
2.创建多个对象
(1)工厂函数模型
(2)构造函数模式
(3)原型模式(不单独使用)
(4)组合模式 (2)+(3)结合体
二,创建对象
1.工厂函数模式
为了批量创建对象
优点:可以批量创建对象 降低代码冗余量
缺点:无法区分种类 全部是Object的实例 方法冗余
例如:
var sayName =function(){
console.log(this.name)
}
function person(name,age,gender){
return {
name:name,
age:age,
gender:gender,
sayName:sayName
}
}
var p1 = person('zhangsan',12,'male');
var p2 = person('lisi',15,'female');
console.log(p1,p2);
p1.sayName();
p2.sayName();
console.log(p1.sayName === p2.sayName);
打印结果:
2.构造函数模式
优点:可以区分种类 可以批量创建对象
缺点:方法冗余
例
var sayName = function(){
console.log(this.name)
}
function Person(name,age,gender){
/* *
* 使用new关键字js做了些什么事情
* 1.创建一个实例对象 p1 Person {}
* 2.将this 指向实例对象 this --->p1 p2 this --->p1{}
* 3.执行函数体 p1.name = 'terry'
* 4.返回实例对象 return p1{}
*/
this.name = name;
this.age = age;
this.gender = gender;
this.sayName = sayName;
}
var p1 = new Person('terry',12,'male');
var p2 = new Person('larry',18,'female');
console.log(p1,p2);
p1.sayName();
p2.sayName();
console.log(p1.sayName === p2.sayName);
/**
* instanceof 判断当前实例对象是否处在原型链上
* 判断是否是某一个构造函数的实例对象
*/
console.log(p1 instanceof Person);
console.log(p2 instanceof Person);
console.log(p1 instanceof Object);
console.log(p2 instanceof Object);
console.log(Person instanceof Object);
打印结果
3.原型模式(不单独使用)
将实例所有属性和方法全部放在原型对象中 构造函数内部不放任何属性和方法
优点:解决了方法冗余 批量创建对象
缺点:所有实例属性和方法全部都是一样的
function Person(){
};
/**
* 1.创建实例对象
* 2.this--->实例对象
* 3.执行函数体
* 4.返回实例对象
*/
console.log(Person.prototype);
console.log(Person.prototype.constructor);
Person.prototype = {
//手动将构造者改为Person
constructor:Person,
name:'lisi',
age:12,
gender:'male',
sayName:function(){
console.log(this.name)
}
}
console.log(Person.prototype);
console.log(Person.prototype.constructor);//constructor 指向Object
Person.prototype.friends = [];
var p1 = new Person();
var p2 = new Person();
console.log(p1.constructor,p2.constructor);
p1.friends.push('tom');
打印结果
4.组合模式
原型模式+构造函数模式
将实例私有属性和方法全部放在构造函数中
将实例公共属性和方法全部放在原型对象中
批量创建对象 区分种类 解决方法冗余
function Person(name,age,gender){
this.name = name;
this.age = age;
this.gender = gender;
this.friends = [];
}
Person.prototype = {
constructor:Person,
sayName:function(){
console.log(this.name)
}
}
var p1 = new Person('terry',12,'male');
var p2 = new Person('larry',15,'female');
console.log(p1,p2);
p1.friends.push('tom');
console.log(p1,p2);
console.log(p1.sayName === p2.sayName);
//所有构造函数都是Object子类型 都在Object这条原型链
console.log(p1 instanceof Person);
console.log(p1 instanceof Object);
console.log(Person instanceof Object);
var arr = [1,2,3,4,5]
console.log(arr instanceof Object);
console.log(arr instanceof Array);
console.log(arr instanceof Person);
打印结果: