原型和隐式原型
1.所有的函数都有一个prototype属性,称为原型,值为一个普通对象。
默认情况下:prototype中有一个属性constructor,也是一个对象,指向构造函数本身。
2.所有的对象都有一个__proto__属性,称为隐式原型,值为一个普通对象。
默认情况下:__proto__指向它构造函数的prototype。
注:
所有的函数都是通过----new Function()----创建的;
所有的对象都是通过----new 构造函数----创建的;
所有的函数都是对象,但是对象不一定是函数(函数有prototype属性,对象有__proto__属性);
有点绕,举个栗子:
先让我们写一个构造函数;
<script>
function Student(name) {
this.name = name;
}
</script>
再创建一个实例对象;
<script>
function Student(name) {
this.name = name;
}
var wyz = new student('wuyanzhu')
console.log(wyz);
</script>
此时,
构造函数Student的prototype(原型)对象中有一个属性constructor指向Student构造函数本身;
实例对象wyz的__proto__(隐式原型)对象指向构造函数Student的prototype(原型)对象,
也就是说:wyz__proto__===Student.prototype;
原型链
当访问对象上的某一个属性时,会先在该对象的本身属性中查找,如果没有,则会在他的__proto__(隐式原型)里查找也就是他的构造函数的prototype(原型)里查找,如果还没有则会去他构造函数的prototype.__proto__查找,没找到就返回undefined,这样一层一层的查询结构就称为原型链。
注:
1.Function的prototype和__proto__指向相同,都指向Function原型
即 Function.protype===Function.__proto__
2.由于所有的对象都是由----new 构造函数----创建的,所以Object以及Array的__proto__都指向Function原型。
查询过程如下: