JavaScript中proto与prototype的关系

8次阅读

共计 1853 个字符,预计需要花费 5 分钟才能阅读完成。

了解 JavaScript 中原型以及原型链只需要记住以下 2 点即可

  • 对象都有__proto__属性,指向构造函数的 prototype
  • 构造函数 \ 函数都有 prototype 属性,指向构造函数的原型

1、对象的__proto__

  • 内置构造函数
Number.__proto__ === Function.prototype  // true
Boolean.__proto__ === Function.prototype // true
String.__proto__ === Function.prototype  // true
Object.__proto__ === Function.prototype  // true
Function.__proto__ === Function.prototype // true
Array.__proto__ === Function.prototype   // true
RegExp.__proto__ === Function.prototype  // true
Error.__proto__ === Function.prototype   // true
Date.__proto__ === Function.prototype    // true

可知所有的构造函数都继承于 Function.prototype , 甚至包括根构造器 Object 及 Function 自身。所有构造器都继承了 Function.prototype 的属性及方法,如 length、call、apply、bind 等。

既然所有的构造器都来自于 Function.prototype, 那么 Function.prototype 是什么呢?

Object.prototype.toString.call(Function.prototype)

"[object Function]"

Function.prototype();
 //undefined

Function.prototype 是函数,是不是很意外!!!

既然 Function.prototype 是函数,那么它就是 Function 的实例,然而并不是这样的!!!

Function.prototype.__proto__ === Function.prototype // false

Function.prototype.__proto__ === Object.prototype // true

如何理解 Function.prototype 不是 Function 实例的怪异行为呢?解决怪异行为的根本方法是让它显得不那么怪异,看下面代码。

Object.prototype.toString.call(Number.prototype)
"[object Number]"

Number.prototype.__proto__ === Number.prototype // false
Number.prototype.__proto__ === Object.prototype // true

Object.prototype.toString.call(String.prototype)
"[object String]"

String.prototype.__proto__ === String.prototype // false
String.prototype.__proto__ === Object.prototype // true

Object.prototype.toString.call(Array.prototype)
"[object Array]"

Number.prototype.__proto__ === Array.prototype // false
Number.prototype.__proto__ === Object.prototype // true

简单理解:内置构造函数的数据类型是对应的构造函数,但不是其对应构造函数的实例,而是 Object 的实例。

2、函数的 prototype

构造函数 \ 函数都有 prototype 属性,指向构造函数函数的原型,原型有 constructor 属性,指向构造函数 \ 函数

  • 构造函数
Number.prototype.constructor === Number
// true

Function.prototype.constructor === Function
//true

Object.prototype.constructor === Object
true
  • 普通函数
function wang(){};

wang.prototype.constructor === wang

//true

关系图

正文完
 0

JavaScript中proto与prototype的关系

8次阅读

共计 2034 个字符,预计需要花费 6 分钟才能阅读完成。

除 Function.prototype 以外,所有构造器 / 函数的__proto__都指向 Function.prototype,它有 constructor 属性,指向 Function

  • 内置构造函数
Number.__proto__ === Function.prototype  // true
Boolean.__proto__ === Function.prototype // true
String.__proto__ === Function.prototype  // true
Object.__proto__ === Function.prototype  // true
Function.__proto__ === Function.prototype // true
Array.__proto__ === Function.prototype   // true
RegExp.__proto__ === Function.prototype  // true
Error.__proto__ === Function.prototype   // true
Date.__proto__ === Function.prototype    // true
  • 普通函数
function Person() {}

Person.__proto__ === Function.prototype // true
Person.__proto__.constructor === Function // true
  • Function.prototype

Function.prototype 是函数,是不是很意外!!!

Object.prototype.toString.call(Function.prototype)

"[object Function]"

Function.prototype();
 //undefined

既然 Function.prototype 是函数,那么它就是 Function 的实例,然而并不是这样的!!!

Function.prototype.__proto__ === Function.prototype // false

Function.prototype.__proto__ === Object.prototype // true

如何理解 Function.prototype 不是 Function 实例的怪异行为呢?解决怪异行为的根本方法是让它显得不那么怪异,看下面代码。

Object.prototype.toString.call(Number.prototype)
"[object Number]"

Number.prototype.__proto__ === Number.prototype // false
Number.prototype.__proto__ === Object.prototype // true

Object.prototype.toString.call(String.prototype)
"[object String]"

String.prototype.__proto__ === String.prototype // false
String.prototype.__proto__ === Object.prototype // true

Object.prototype.toString.call(Array.prototype)
"[object Array]"

Number.prototype.__proto__ === Array.prototype // false
Number.prototype.__proto__ === Object.prototype // true

简单的理解:内置构造函数的 prototype 数据类型是对应的构造函数,但不是其对应构造函数的实例,而是 Object 的实例。

除 Object.prototype 以外,所有对象的__proto__ 都指向其构造器的 prototype

  • 内置构造器
var obj = {name: 'tao'}
var arr = [1,2,3]
var err = new Error('exception')
 
console.log(obj.__proto__ === Object.prototype) // true
console.log(arr.__proto__ === Array.prototype)  // true
console.log(err.__proto__ === Error.prototype)  // true
  • 自定义构造器
function Person(name) {this.name = name}

var p = new Person('jack')

console.log(p.__proto__ === Person.prototype) // true
  • Object.prototype

又有特殊情况了,看代码

Object.prototype.__proto__ === null

Object.prototype 是根对象,所有对象的方法都是继承于它,它没有构造函数,只有原型 null,原型链结束。

加深理解,看图

正文完
 0