原型链
概述
- prototype 每个函数都有一个prototype属性,被称为显示原型
- . _ proto _ 每个实例对象都会有_ proto 属性,其被称为隐式原型 每一个实例对象的隐式原型 proto
_属性指向自身构造函数的显式原型prototype - 任何对象都是由一个构造函数创建的,被创建的对象都可以获得构造函数的prototype属性
注意:对象是没有prototype属性,只有方法才有prototype属性
什么是原型链?
在获取对象属性时,如果对象本身没有这个属性,那就会去他的原型__proto__上去找,就一层层的扒出创建对象的构造函数,直至到Object时,就没有_proto_指向了,_proto_实质找的是prototype,所以只要找这个链条上的构造函数的prototype,Object.prototype对象属性值为null
示例:
//内置对象的原型链
var arr = [];
console.log(arr);
//从内置对象上可以观察到
//实例化的当前对象
//__proto__ 原型链 指向自身的 构造函数的原型对象
//原型对象上具有
//原型属性以及原型方法 构造函数constructor 指向函数本身
console.log(arr.__proto__); //Array
console.log(arr.__proto__.__proto__); //object
console.log(arr.__proto__.__proto__.__proto__); //null
console.log(arr.__proto__ == Array.prototype);//true
console.log(arr.__proto__.__proto__ == Object.prototype);//true
示例
function Method() {
}
var p = new Method();
//方法才有prototype,普通对象无prototype
console.log(Method.prototype); // Object{
}
console.log(p.prototype); // undefined
//任何对象都是有构造函数constructor,由构造函数创建的对象也可以获得构造函数的引用
//此处只是打印下列对象的构造函数是什么。
console.log(p.constructor); //function Method(){
}
console.log( Method.constructor); //function Function(){
}
console.log({
}.constructor); // function Object(){
}
console.log(Object.constructor); // function Function() {
}
console.log([].constructor); //function Array(){
}