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