创建对象的几种方法
1.Object实例
var person = new Object();
2.字面量语法创建
var person= {name:“Nicholas”}
弊端:
要产生大量对象,会产生大量重复代码
solve:
用工厂模式,多次调用这个函数,创建相似对象
3.工厂模型
function createPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
console.log(this.name);
}
return o;
}
var person1 = createPerson('lili',29,'teacher');
var person2 = createPerson('lulu',60,'Doctor');
person1.sayName();//lili
person2.sayName();//lulu
// ECMAScript的函数是对象,因此每定义一个函数,就实例化一个对象
console.log(person1.name ==person2.name)//false
console.log(person1.sayName == person2.sayName)//false
//
console.log(person1.constructor == createPerson)//false计算机识别是false.按理来说是true.
console.log(person1 instanceof createPerson)//false计算机识别是false.按理来说是true.
优点:解决了多次调用这个函数创建相似对象
缺点:他不知道创建的这个对象从那里来的,用instanceof,construtor都不起作用(这个缺点可以由构造函数创建对象来解决)
4.构造函数
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
//sayName是一个指向函数的指针,将sayName属性设置成等于全局的sayName函数
}
//通过函数定义转移到构造函数外部来解决这个问题
//这个问题就是:避免创建多个完成完成同样任务的Function实例,浪费内存空间。
function sayName (){
alert(this.name)
}
var person1 = new Person('lisi',29,"software Engineer");
var person2 = new Person('gouzi',39,"Doctor");
console.dir(person1);
console.dir(person2);
优点:知道自己创建的对象是哪里来的。
缺点:会创建多个完成同样任务的Function实例
solve
将函数定义放在构造函数外面>又产生新的问题
新问题:若定义超多方法,就会生成很多全局函数,毁了封装的概念。
解决就是“原型模型”
5.原型模型
可以让所有的实例共享它所包含的属性和方法
function Person(){ }
Person.prototype.name = 'lili';
Person.prototype.age = '40';
Person.prototype.sayName = function(){
console.log(this.name);
}
var person1 = new Person();
person1.sayName();//lili
var person2 = new Person();
person1.sayName();//lili
console.log(person1.sayName == person2.sayName)//true