创建对象
- 工厂模式
function createPerson(name,age,job){
let o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
console.log(this.name);
}
return o;
}
let person1=createPerson("lu1",20,"student");
let person2=createPerson("lu2",20,"teacher");
- 构造函数模式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
console.log(this.name);
}
}
let person1=new Person("lu1",20,"student");
let person2=new Person("lu2",20,"teacher");
- 原型模式
function Person(){
Person.prototype.name='lu';
Person.prototype.age=20;
Person.prototype.job='student';
Person.prototype.sayName=function(){
console.log(this.name);
}
}
let person1=new Person();
let person2=new Person();
//如果再实例上添加了一个与原型对象中同名的属性,那么就会在实例上创建这个属性,这个属性会遮住原型对象上的属性。
person1.name="Greg";
console.log(person1.name);//Greg,来自实例
console.log(person2.name);//lu,来自原型
//即使在实例上把这个属性设置为null,也不会恢复它和原型的联系,只有通过delete操作符完成删除实例上的这个属性。
delete person1.name;
console.log(person1.name);//lu,来自原型例
原型与原型链
- 构造函数有一个prototype属性,引用其原型对象,而这个原型对象也有一个constructor属性,引用这个构造函数。
- 通过
_proto_
属性可以访问每个对象的原型,而prototype 是属于一个函数特有的属性。 - 实例域构造函数没有直接联系,与原型对象有直接联系。
- 构造函数的原型属性
prototype
指向了原型对象,在原型对象有的属性和方法,构造函数构造出的实例都可以继承共享。 - 构造函数、原型对象、实例是3个完全不同的对象。
Person===Person.prototype.constructor;
Person.prototype._proto_===Object.prototype;
Person.prototype._proto_.constructor====Object;
Person.prototype._proto_._proto_===null;
person1._proto_.constructor===Person;
person1._proto_===person2._proto_;//同一个构造函数创建的两个实例共享同一个原型对象