原型与原型链、原型模式创建对象

创建对象

  • 工厂模式
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_;//同一个构造函数创建的两个实例共享同一个原型对象

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lujiebin/article/details/115179998