02------JS函数高级之原型与原型链

原型和原型链

1.原型

函数的prototype属性

  • 每个函数都有一个prototype属性,它默认指向一个Object空对象(即原型对象)
  • 原型对象中都有一个construtor,它指向函数对象
//每个函数都有一个prototype属性,它默认指向一个Object空对象(即原型对象)
console.log(Date.prototype)
console.log(typeof Date.prototype) //object
// 原型对象中都有一个construtor,它指向函数对象
console.log(Date.prototype.construtor === Date)

给原型对象增加属性(一般都是方法)
作用:函数的所有实例对象自动拥有原型中的属性(方法)

//给原型对象增加属性(一般都是方法),实例对象可以访问
Fun.prototype.test = function () {
	console.log('test()')
}
var fun = new Fun()
fun.test()

2.显示原型与隐式原型

  • 每个函数function都有一个prototype,即显示原型(属性)
  • 每个实例对象都有一个__proto__,可称为隐式原型(属性)
  • 对象的隐式原型的值对应其构造函数的显示原型的值
function Fn() { //内部语句:this.prototype = {}

}
//显示原型
console.log(Fn.prototype)
//隐式原型
var fn = new Fn() // 内部语句:this.__proto__ = Fn.prototype
console.log(fn.__proto__)
//对象的隐式原型的值对应其构造函数的显示原型的值
console.log(Fn.prototype === fn.__proto__) // true

可以参考结构图理解:
在这里插入图片描述
总结:

  • 函数的prototype属性:在定义函数时自动添加的,默认值是一个空的Object对象
  • 对象的__proto__属性:创建对象时自动添加的,默认值为构造函数的prototype属性值
  • 能直接操作显示原型,但不能直接操作隐式原型(ES6之前)

3.原型链

原型链

  • 访问一个对象属性时
    • 先在自身属性中查找,找到返回
    • 如果没有,再沿着__proro__这个链向上查找,找到返回
    • 如果最终没有找到,返回undefined
  • 别名:隐式原型链
  • 作用:查找对象的属性(方法)

构造函数/原型/实体对象的关系(图解)
在这里插入图片描述

  • 函数的显示原型指向的对象默认是空Object实例对象(Object除外)
console.log(Fn.prototype instanceof Object) //true
console.log(Object.prototype instanceof Object) //false
console.log(Function.prototype instanceof Object) //true
  • 所有函数都是Function的实例(包含Function)
console.log(Function.__proto__ === Function.prototype) //true
  • Object的原型对象是原型链尽头
console.log(Object.prototype.__proto__) // null
  • 读取对象的属性时:会自动到原型链中查找
  • 设置对象的属性值时:不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值
  • 方法一般定义在原型中,属性一般通过构造函数定义在对象本身上

4.instanceof

instanceof操作符用来在运行时检测一个对象的类型

instanceof是如何判断的?

  • 表达式:A instanceof B
  • 如果B函数的显示原型对象在A对象的原型链上,返回true,否则返回false

注意:Object和Function既是对象,又是函数,两者内部同时含有__proto__和prototype属性

console.log(Object.__proto__ === Function.prototype) //true
console.log(Object.__proto__ === Function.__proto__ ) //true
console.log(Object.prototype === Function.prototype.__proto__) //true

console.log(Object instanceof Function) //true
console.log(Object instanceof Object) // true
console.log(Function instanceof Function) // true
console.log(Function instanceof Object) // true
function Foo() {}
console.log(Object instanceof Foo) // false

图解:
在这里插入图片描述
5.面试题
1).

function A () {
}
A.prototype.n = 1
var b = new A()
A.prototype = {
	n: 2,
	m: 3
}
var c = new A()
console.log(b.n, b.m, c.n, c.m) // 1 undefined 2 3
function F() {}
Object.prototype.a = function() {
	console.log('a()')
}
Function.prototype.b = function() {
	console.log('b()')
}
var f = new F()
f.a() // a()
f.b() // undefined
F.a() // a()
F.b() // b()
发布了56 篇原创文章 · 获赞 32 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/hry1243916844/article/details/104054767