原型原型链
1、函数的prototype
1.每个函数都有一个prototype属性 ,默认指向一个object空对象(原型对象); 2.原型对象中有一个属性construction,指向函数对象;
<script type="text/javascript">
// 每个函数(例如Data函数)都有一个prototype属性, 它默认指向一个Object空对象(即称为: 原型对象)
console.log(Date.prototype, typeof Date.prototype)
function Fun () {//alt + shift +r(重命名rename)
}
console.log(Fun.prototype) // 默认指向一个Object空对象(即没有我们自定义的属性)
<script/>
2.任意函数的原型对象的构造器指向函数对象
// 任意函数的原型对象中有一个属性constructor, 它指向函数对象
console.log(Date.prototype.constructor===Date) //true
console.log(Fun.prototype.constructor===Fun)//true
3.构造函数和原型对象相互引用
1.函数 Type的prototype属性指向 Type的原型对象object 2.Type原型对象(Type.prototype)的constructor构造器指向函数 Type
4. 给原型对象添加属性(一般是方法)
作用:函数的所有实例对象自动拥有原型中的属性(方法) 可以给原型对象增加自定义属性(一般是方法) 通过函数.prototype.自定义函数=function(){} 的方式进行增加
//给原型对象添加属性(一般是方法) ===>实例对象可以访问
Fun.prototype.test = function () {
console.log('访问了test()')
}
var fun = new Fun()
fun.test()
5.显式原型和隐式原型
函数的prototype 指的是函数的显式原型
每一个实例对象都有一个 ****proto___ 属性 ,称为隐式原型
实例对象隐式原型的值为其构造函数的显式原型的值
function Fun () {
// this.prototype = {}
}
console.log(Fun.prototype) //函数的显式原型 默认也是指向一个空的object
//创建实例对象
let fun = new Fun()
//this.__proto__ = Fun.prototype
console.log(fun.__proto__) //实例的隐式原型
console.log(fun.__proto__ == Fun.prototype ) //true
//给原型添加方法
Fun.prototype.test = function (){
console.log('123123')
}
//通过实例对象调用方法
fun.test() // 123123
6.原型链
构造函数的显示原型和实例对象的隐式原型相等
所有构造函数的隐式原型都是一致的 都是Function.rototype
\