每一个函数都有prototype属性。它默认指向一个Object的空属性(即称为原型对象)。
原型对象中有一个属性constructor,它指向函数对象。
给原型对象添加属性:函数的所有实例对象自动拥有原型中的属性(方法)。
空对象默认没有我们自己定义的属性。例如:
function fun() {
}
fun.prototype.test = function () {
console.log('test')
}
prototype属性内部结构
给原型对象添加属性方法,一般是给实例对象使用。例如:
var f = new fun()
f.test()
显示原型与隐式原型
每个function都有一个prototype,即显示原型(属性)。默认指向一个空的Object对象。
每个实例对象都有一个__proto__,即隐式原型(属性)。
对象隐式原型的值对应其构造函数的显示原型的值。
function Fn(){
}
var fn = new Fn()
console.log(Fn.prototype === fn.__proto__)
prototype是函数定义的时候添加的。__proto__是对象创建的时候添加的。默认值为构造函数的显示原型的值。
在定义函数Fn的时候,函数内部会自动执行一段语句
this.prototype = {}
内存结构
内部结构
此时我们给Fn类添加新的方法
Fn.prototype.test = function () {
console.log('interior')
}
之后使用fn实例调用
fn.test()
我们发现依然可以调用test方法。这是因为当fn发现自己的对象内部没有这个方法的时候会查看__proto__。查看其中是否有自己想要的方法。
注意:程序员可以操作显示原型。但是不要直接操作隐式原型(ES6之前)。













网友评论