Skip to content

《读 - JavaScript深入系列15篇》 #20

@wangsiyuan0215

Description

@wangsiyuan0215

这篇文章是我在读《JavaScript深入系列15篇》系列文章的过程中,关键点的总结和认知错误的纠正。

先上原文地址:JavaScript深入系列15篇

正文开始~

《JavaScript深入之从原型到原型链》

首先纠正以前的认知错误:

prototype 并非仅属于构造函数,只要是函数那么均有 prototype 属性,指向函数的原型对象,包括 javaScript 的变量类型,如:StringNumberObjectArray 等等(均是函数)。

__proto__ 属性同样的,并非只属于实例,只要是对象(除了 null)均具有一个属性 __proto__,指向该对象的构造函数的原型。

/* 需要注意的是 */
function Person () { /.../ }
var person = new Person();

/* person 通过使用 new 关键字被创建为对象,因此只有 __proto__,没有 prototype */
/* Person 是函数,因此有 prototype */
person.__proto__ === Person.prototype; // true

/* Person 是通过函数声明的方式创建的,本质上等于 new Function,因此 Person.__proto__ 就是 Function 的原型 */
Person.__proto === Function.prototype; // true

纠正一个误区就是:Person 并不是原型,Person.prototype 才是原型。

根据文中所示,以及讨论中可以获取如下知识点:

/* 盲点 */
/* 1. 一切皆对象!对于原型链的末端必然是 Object.prototype.__proto__ === null 停止原型链的查找 */
1. Object.prototype.__proto__ === null // true

/* 2. Function.prototype 比较特殊,特殊特记就好 */
2. Function.prototype === Function.__proto__ // true

/* 3. Function.prototype 是原型对象,对象的原型是 Object.prototype */
3. Function.prototype.__proto__ === Object.prototype // true

/* 4. 前面说了,Object 是函数,那么它的构造函数是 Function 类型,那么它的 __proto__ === Function.prototype */
4. Object.__proto__ === Function.prototype // true

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions