构造函数/原型/作用域链

来源:互联网 发布:蚁群算法的优缺点 编辑:程序博客网 时间:2024/06/09 13:39
function Person(name,age){this.name=name;this.age=age;this.say=function(){console.log('我叫'+this.name);};}Person.prototype.say=function(){     console.log('我叫'+this.name);};Person.prototype.sex='男';



知识点
//构造函数 Person这个函数就是一个构造函数.前提是用new调用它,      构造函数的作用就是用来创建对象的,
//创建对象     p1就是创建的对象
//实例     new Person('小明',18)就是实例;
//实例化       Person里执行函数的过程就是 实例化
//原型 函数身上的属性prototype   .它的值是一个对象,  它身上可以放属性和方法

var p1=new Person('小明',18);

一 丶构造函数和原型
通过构造函数创建的对象就会具有(构造函数原型)身上的属性与方法
 p1是通过构造函数创建的对象,那它就会有(构造函数身原型身上的属性和方法) person.prototype
 

p1.say();

//二丶作用域链
*为什么p1会有构造函数原型身上的方法呢?
 原因是作用域链的关系,
   当我们去调用p1身上的say(属性和方法)时,那它就会按照一定的规则去查找
1.首先p1会在自己身上找,如果有的话就用自己的
2.如果没有的话,他就会在p1(该对象)的__proto__下去查找,刚好p1的__proto__的值等于person的prototype的值,如果找到了就拿过来用,
   3.如果person的prototype身上也没有,那它就会一致往外找,直到找到最顶层的object身上的prototype
 

  三丶__proto__
 
  p1是person的实例   p1是一个对象,p1身上有__proto__这个属性  p1身上的__proto__属性的值也是一个*对象*  ,*对象*的值就person的prototype的值
 
  简单的来说就是p1的__proto__的值等于person的prototype的值
 


  __proto__
   对象身上的属性,每一个对象身上都会有这个属性。它的值也是一个对象,它的值就是它对应的构造函数的prototype的值
   对象.__proto__===构造函数.prototype
  
对象之所以能够继承原型身上的属性与方法,是因为每个对象身上都有一个__proto__,那__proto__的值指向了构造函数的prototype
 


原创粉丝点击