JavaScript中原型以及原型链

Posted UI前端小菜一名

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript中原型以及原型链相关的知识,希望对你有一定的参考价值。

js中原型以及原型链

什么是原型对象

每个函数身上都有一个原型,我们称之为 原型对象

函数的 prototype 属性指向原型对象,原型对象上的 constructor 指回构造函数

废话少说,直接看代码

function Person() {
  this.uname = '张三', 
  this.age = 22
}
// 原型对象
Person.prototype.sex = '男'
Person.prototype.head = 1
Person.prototype.sayName = function () {
  console.log('说名字')
}
console.log(Person.prototype)

// Person.prototype.constructor 指回构造函数
console.log(Person.prototype.constructor)

// 实例化对象
let per = new Person()
console.log(per)
console.log(per.head) // 1

原型对象如图( console.log(Person.prototype) )

我们 console.log(per.head) 会看到如图打印结果 1

原型对象中 constructor 指回了构造函数 Person ,而构造函数里面的 prototype 又指向了原型对象,在原型对象上添加的属性或者方法,实例化对象可以直接访问,比如在原型上添加的 head 属性,通过实例对象可以直接访问到并且在控制台输出 1,其实函数身上的很多内置的方法就是在他的原型对象上,下图可以看出在构造函数原型上添加的属性方法

实例化对象如图

实例化对象的__proto__ 也是指向原型对象,只能看,不能访问,在原型上定义的属性或者方法都可以看到,可以看到原型对象里面的 constructor 指回了构造函数 Person,通过 console 打印可以看到构造函数 Person

原型链

我们还是拿到上面的代码进行分析

function Person() {
  this.uname = '张三', 
  this.age = 22
}
// 原型对象
Person.prototype.sex = '男'
Person.prototype.head = 1
Person.prototype.sayName = function () {
  console.log('hello javascript')
}

function Chinese() {
   this.eat = function() {
       console.log('eat')
   }
}

// 让 Chinese 构造函数的原型对象等于 Person 的实例
Chinese.prototype = new Person()

// 实例化 Chinese
let chinese = new Chinese()

console.log(chinese)
chinese.sayName() 

上面代码可以分析出 Chinese 的原型是 Person 实例化对象,sayName 方法定义在 Person 构造函数的原型上

但是,我们直接在 Chinese 实例化对象上访问 sayName 方法也可以( chinese.sayName() ),会在控制台输出里面的内容 “hello javascript”,因此,从代码打印结果分析,原型对象、构造函数、实例化对象的关系

调用一个对象上的属性或方法,会先在自身上面找,找不到会去原型对象上找,自身的原型对象上没有会沿着__proto__ 继续向上级的原型对象上找,找不到就会返回 null

这种有原型串联起来的链状结构就称之为原型链,作用:提供了查找机制,例如对象的属性、方法

以上是关于JavaScript中原型以及原型链的主要内容,如果未能解决你的问题,请参考以下文章

[javascript]js原型链以及原型链继承

03. JavaScript高级(3/5)(原型链讲解)

好文要顶之 --- 简单粗暴地理解 JavaScript 原型链

好文要顶之 --- 简单粗暴地理解 JavaScript 原型链

JavaScript原型链以及ES3ES5ES6实现继承的不同方式

JavaScript原型链以及ES3ES5ES6实现继承的不同方式