函数的 原型(prototype)
-
函数的 protot 属性
- 每个函数都有一个 prototype 属性,它默认指向一个 object 空对象(即称为:原型对象)
- 原型对象中有一个属性 constructor,它指向函数对象
-
给原型对象增加属性(个别都是办法)
-
作用:函数的所有实例对象主动领有原型中的属性(办法)
// 每个函数都有一个 prototype 属性,它默认指向一个 Object 空对象(即称为:原型对象)console.log(Date.prototype , typeof Date.prototype) function fun () {} fun.prototype.test = function () {console.log('test()') } console.log(fun.prototype) // 默认指向一个 Object 空对象(没有咱们的属性)// 原型对象中有一个属性 constructor,它指向函数对象 console.log(Date.prototype.constructor===Date) console.log(fun.prototype.constructor===fun) // 给原型对象增加属性(个别是办法)==> 实例对象能够拜访
-
显式原型和隐式原型
- 每个函数 function 都有一个 prototype,即显式原型(属性)
- 每个实例对象都有一个__proto__ , 可称为隐式原型(属性)
- 对象的隐式原型的值为其对应构造函数的显式原型的值
- 内存构造
-
总结
- 函数的 prototype 属性:在定义函数时主动增加的,默认值是一个空 Object 对象
- 对象的__proto__属性:创建对象时主动增加的,默认值为构造函数的 prototype 属性值
- 程序员能间接操作显式原型,但不能间接操作隐式原型(ES6 之前)
// 定义构造函数
function Fn(){ // 外部语句:this.prototype = {}
}
//1. 每个函数 function 都有一个 prototype,即显式原型,默认指向一个空的 Object 对象
console.log(Fn.prototype)
//2. 每个实例对象都有一个__proto__ , 可称为隐式原型
var fn = new Fn() // 外部语句:this.__proto__=Fn.prototype
console.log(fn.__proto__)
//3. 对象的隐式原型的值为其对应构造函数的显式原型的值
console.log(Fn.prototype===fn.__proto__) //true
// 给原型增加办法
Fn.prototype.test = function(){console.log('test')
}
// 通过实例调用原型的办法
fn.test()