一、原型
每个函数都有一个prototype属性,它默认指向一个object空对象(即称为:原型对象), 原型对象中有一个属性constructor,它指向函数对象本身
-
每个函数function都有一个prototype,即显示原型(属性)
-
每个实例对象都有一个 __ proto __ ,可称为隐式原型(属性)
-
对象的隐式原型的值为其构造函数的显示原型的值,即:
function Fn() { //构造函数
}
var fn = new Fn() //实例对象
console.log(Fn.prototype === fn.__proto__) //true
函数的prototype属性:在定义函数时自动添加的,默认值是一个空object对象
对象的 __ proto __属性:创建对象时自动添加的,默认值为构造函数的prototype属性值
二、原型链
访问一个对象的属性时,
- 先在自身属性中查找,找到返回
- 如果没有,再沿着 __ proto __这条链向上查找,找到返回
- 如果最终没找到,返回undefined
- 作用:查找对象的属性(方法)
代码示例:
function Fn(){ // 构造函数
this.test1 = function(){
console.log("test1")
}
}
Fn.protoptype.test2 = function(){ //给构造函数的prototype中添加属性
console.log("test2")
}
var fn = new Fn() //实例对象
//调用
//寻找这以下函数的路径
fn.test1()
//直接构造函数中有
fn.test2()
//构造函数中找不到,去构造函数的prototype中找到(即fn.__proto__)
console.log(fn.toString())
//构造函数中找不到,构造函数的prototype中找不到,去构造函数的__proto__中找到
fn.test3()
//构造函数中找不到,构造函数的prototype中找不到,去构造函数的__proto__中找不到(链路尽头),找不到返回null
以下图示: