目录
1. prototype 原型对象
1.1介绍
每一个【函数】都有偶一个propotype属性,指向原型对象
普通函数也有propotype属性,没有用。
只需要关注构造函数的prototype属性
1.2 语法
函数名.prototype
1.3 作用
原型对象上的属性和方法可以被实例对象共享
1.4 实例
<script>
//创建学生的构造函数
function Student(name,age,sex){
this.name=name;
this.age = age;
this.sex = sex;
}
//在原型对象上定义属性和方法,原型对象上的属性和方法可以被实例对象共享
Student.prototype.court='web课程';
Student.prototype.summer='夏天'
Student.prototype.hobby=function(){
return this.age+"的"+ this.name + "爱上" +this.court +'喜欢在'+this.summer+'穿秋裤略略略'
}
//创建构造函数的实例对象
let s1=new Student('小爽',19,'女')
console.log(s1);
console.log(s1.court);
console.log(s1.hobby());
</script>
效果:
1.5 总结
1)原型对象上的属性和方法可以被实例对象共享
2)只要修改原型对象,变动就立刻会体现在所有实例对象上
3)如果实例对象自身就有某个属性或方法,他就不会再去原型对象寻找这个属性或方法
2.constructor 构造函数
2.1 介绍
每一个【原型对象】都有constructor属性,指向构造函数
原型对象上的属性和方法可以被实例对象共享,所以实例对象也有constructor属性,指向创建实例的构造函数
2.2 语法
对象.constructor
2.3 作用
constructor属性的作用是,可以得知某个实例对象,到底是哪一个构造函数产生的。
2.4 实例
<script>
function F() {};
var f = new F();
console.log(f.constructor === F); // true
console.log(f.constructor === Function); // false
</script>
3. __proto__
3.1介绍
__proto__属性是每一个对象以及函数都隐含的一个属性。
__proto__属性指向的是创建他的构造函数的prototype。原型链就是通过这个属性构件的。
即每一个【对象】和【函数】都有 __proto__属性,指向它的原型对象
3.2 语法
对象.__proto__
最大的原型对象是 Object.prototype
Object.prototype 的原型呢?
Object.prototype.__proto__ 的值为 null,也就是说 Object.prototype 没有原型。所以查找属性的时候查到 Object.prototype 就可以停止查找了。
Object.prototype.__proto__ //null
3.4实例
function Person() {}
var p1 = new Person();
console.log(p1.__proto__); //指向Person的原型
console.log(p1.__proto__.__proto__); //指向Person的原型的原型--Object.prototype
console.log(p1.__proto__.__proto__.__proto__); //null
console.log(Object.prototype.__proto__); //null
3.3 原型链
读取对象的属性,先读取对象本身的属性,如果没有,去原型对象上查找。若还没有,继续去原型对象的原型对象上查找,
最终到Object.prototype上查找,如果没有 就返回undefined
通过__proto__查找属性的过程 形成一条链状结构,称为原型链
4.总结
4.1 每一个【函数】都有prototype属性,指向他的【原型对象】
4.2 每一个【对象】都有constructor属性,指向他的【构造函数】
4.3 每一个【对象】和【函数】都有__proto__属性,指向他的【原型对象】
原型链:关系图如图:
图中由相互关联的原型组成的链状结构就是原型链,也就是蓝色的这条线