prototype

每个函数都有一个prototype属性,它默认指向一个object空对象(原型对象,没有我们的属性)
原型对象中有一个属性constructor,指向函数对象

console.log(typeof Date.prototype)    //return object
console.log(Date.prototype.constructor===Date) //return true

给原型对象添加属性(一般是方法)===>实例对象可以访问

function Fun(){}
Fun.prototype.test=function(){
    ​console.log('test()')
}
var fun=new Fun()
fun.test()
//return test()

显式原型与隐式原型

每个函数function都有一个prototype,即显式原型(属性),默认指向一个空的object对象
每个实例对象都有一个__proto__ ,可称为隐式原型(属性),默认值为构造函数的prototype属性值
对象的隐式原型的值为其对应构造函数的显式原型的值

function Fn() { }
console.log(Fn.prototype)//return object
var fn = new Fn()
console.log(fn.__proto__)//return object
console.log(Fn.prototype === fn.__proto__)//teturn true
//给原型添加方法
Fn.prototype.test = function () {
    console.log('test()')
}
fn.test()

内存结构

24

注:程序员能直接操作显式原型,但不能直接操作隐式原型(ES6之前)

原型链

访问一个对象的属性时,先在自身属性中寻找,找到返回。如果没有,再沿着__proto__这条链上寻找,找到返回,如果最终没找到,返回undefined
别名:隐式原型链
作用:查找对象的属性(方法)
25
所有函数的__proto__都是一样的

补充

函数的显示原型指向的对象默认是空Object实例对象(但Object不满足)
所有函数都是Function的实例(包括Function)
Object的原型对象是原型链的尽头

console.log(Fn.prototype instanceof Object)//return true

console.log(Object.prototype instanceof Object)//return false

console.log(Function.prototype instanceof Object)//return true

//所有函数都是Function的实例(包括Function)
console.log(Function.__proto__===Function.prototype)//return true
//Object的原型对象是原型链的尽头
console.log(Object.prototype.__proto__)//null

属性问题

读取对象的属性值时,会自动到原型链中查找
设置对象的属性值时,不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值

instanceof

A instancof B
如果B函数的显式原型对象在A对象的原型链上,返回true,否则返回false

console.log(Object instanceof Function)//return true

console.log(Object instanceof Object)//return true

console.log(Function instanceof Function)//return true

console.log(Function instanceof Object)//return true

function Foo(){}

console.log(Object instanceof Foo)//return false

Q.E.D.