一、原型
首先明确一个概念,原型是一个属性。因此:只有引用类型才会出现属性的这个概念。
- 1、所有的引用类型(Object、Array等)都会拥有一个
_ _ proto _ _
属性(隐式原型),属性值是一个普通的对象 - 2、所有函数Function都有一个
prototype
属性(显示原型),属性值是一个普通的对象
var a=[1,2.3]
var b={
1:'1',
2:'2',
3:'3',
}
var c = function() {}
console.log(a.__proto__ ,a.prototype) //[constructor:xxxx …] undefined 非Function没有prototype
console.log(b.__proto__ ,b.prototype) //{constructor:xxx …} undefined 非Function没有prototype
console.log(c.__proto__,c.prototype) // ƒ(){} {constructor: ƒ}
3、 所有引用类型的_ _ proto _ _
(隐式原型)属性指向它构造函数的prototype
(显示原型)属性
console.log(a.__proto__ === Array.prototype)//true
console.log(b.__proto__ === Object.prototype) //true
console.log(c.__proto__ === Function.prototype) // true
二、原型链
当我们需要查找一个对象的某个属性的时候,会现在他自己的本身属性上查找,如果没有,则去查找proto这个隐式原型查找,即它的构造函数的prototype(这两个东西在内存中是同一个地址),如果没有找到,就会继续在构造函数的prototype属性的_proto_中查找,这样一层一层向上形成一个链式结构。叫做原型链。