欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-08 14:59:36
...

原型和原型链

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

可以参考结构图理解:
02------JS函数高级之原型与原型链
总结:

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

3.原型链

原型链

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

构造函数/原型/实体对象的关系(图解)
02------JS函数高级之原型与原型链

  • 函数的显示原型指向的对象默认是空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

图解:
02------JS函数高级之原型与原型链
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()