热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解JavaScript中的原型和原型链机制

在JavaScript中,原型和原型链是核心概念。通过定义构造函数`functionFoo(){}`,可以创建实例对象`letf1=newFoo()`。继承机制主要依赖于每个函数都具有的`prototype`属性,除了内置的`Function`构造函数之外,这一特性使得对象间的属性和方法共享成为可能。原型链通过链接这些原型对象,实现了复杂而灵活的继承结构,为JavaScript的面向对象编程提供了坚实的基础。

《一次性搞懂js中的原型与原型链》

组织函数:function Foo ( ) { };
实例对象:let f1=new Foo;

  1. 谈到继续时,Javascript 只要一种构造:对象
  2. 每一个函数都有 prototype 属性,除了 Function.prototype.bind(),该属性指向原型。
prototype

每一个Javascript对象(null除外)在建立的时刻就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都邑从原型”继续”属性。

函数的 prototype 属性指向了一个对象,这个对象恰是挪用该组织函数而建立的实例的原型,也就是这个例子中的 f1 的原型。prototype带有__proto__和constructor

proto

每一个Javascript对象(除了 null )都具有的一个属性,叫
__proto__,这个属性会指向了
建立该对象的组织函数的原型。

console.log(f1._proto_ === Foo.prototype) // trueconstructor

每一个原型都有一个 constructor 属性指向关联的组织函数

因为实例对象能够继续原型对象的属性,所以实例对象也具有constructor属性,一样指向原型对象对应的组织函数。

console.log(Foo.prototype.cOnstructor=== Foo);//true
console.log(f1.cOnstructor=== Foo);//true
console.log(f1.hasOwnProperty('constructor'));//false
原型链

JS在建立对象(不论是一般对象照样函数对象)的时刻,都有一个叫做__proto__的内置属性,用于指向建立它的函数对象的原型对象prototype。以上面的例子为例:

console.log(fo.__proto__ === Foo.prototype) //true

一样Foo.prototype也有proto属性

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

Object.prototype对象也有proto属性,但它比较特别,为null

console.log(Object.prototype.__proto__ === null)

我们把这个有proto串起来的直到Object.prototype.proto为null的链叫做原型链。原型链的构成是真恰是靠proto 而非prototype

总结
  • 每一个组织函数都有一个原型对象

    Foo.prototype

  • 原型对象都包括一个指向组织函数的指针

    Foo.prototype.cOnstructor=== Foo

  • 实例都包括一个指向原型对象的内部指针

    fo.__proto__ === Foo.prototype

更多文章请前去语雀


推荐阅读
author-avatar
patrick0129_645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有