这篇文章是我在读《JavaScript深入系列15篇》系列文章的过程中,关键点的总结和认知错误的纠正。
先上原文地址:JavaScript深入系列15篇。
正文开始~
首先纠正以前的认知错误:
prototype 并非仅属于构造函数,只要是函数那么均有 prototype 属性,指向函数的原型对象,包括 javaScript 的变量类型,如:String,Number,Object,Array 等等(均是函数)。
__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
这篇文章是我在读《JavaScript深入系列15篇》系列文章的过程中,关键点的总结和认知错误的纠正。
先上原文地址:JavaScript深入系列15篇。
正文开始~
《JavaScript深入之从原型到原型链》
首先纠正以前的认知错误:
prototype并非仅属于构造函数,只要是函数那么均有prototype属性,指向函数的原型对象,包括 javaScript 的变量类型,如:String,Number,Object,Array等等(均是函数)。__proto__属性同样的,并非只属于实例,只要是对象(除了null)均具有一个属性__proto__,指向该对象的构造函数的原型。纠正一个误区就是:Person 并不是原型,Person.prototype 才是原型。
根据文中所示,以及讨论中可以获取如下知识点: