Skip to content
On this page

原型和原型链

555 死记硬背一下内容:

  • 所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(null除外)
  • 所有的引用类型(数组、对象、函数),都有一个 __proto__ 属性,属性值是一个普通的对象
  • 所有的函数,都有一个 prototype 属性,属性值也是一个普通的对象
  • 所有的引用类型(数组、对象、函数),__proto__ 属性值指向它的构造函数的 prototype 属性值
  • 实例的隐式原型 === 构造函数的显示原型, 即:person.__proto__ === Person.prototype, person:实例,Person:构造函数
  • 找一个引用类型的属性 找不到就找他爸(构造函数) 的prototype 再找不到就继续找他爷爷 一直 往上找 最后找到 Object.prototype.proto === n

JavaScript 世界万物诞生记

创建一个构造函数对象

创建一个构造函数 Person

javascript
function Person() {}

var person = new Person()
person.name = 'k'

console.log(person.name)  // k

Person 就是一个构造函数,使用 new 创建一个实例对象 person

prototype

每个函数都会有一个prototype。

javascript
function Person() {}

Person.prototype.name = 'k'

// 实例 person1
var person1 = new Person()

// 实例 person2
var person2 = new Person()

console.log(person1.name);  // k
console.log(person2.name);  // k

函数的 prototype 属性指向了一个对象 Person.prototype ,这个对象是调用该构造函数所创建的实例的原型, 也就是 person1 和 person2 的的原型

什么是原型

每一个 JavaScript 对象(null 除外)在创建的时候就会与之关联另一个对象, 这个关联的对象就是我们所说的原型,每一个对象都会从原型继承属性

实现一个没有原型的对象:

Object.create(null)

javascript
const o = Object.create(null)

console.log(o)      // {}

o.constructor       // undefined

o.__proto__         // undefined

o instanceof Object // false

什么是原型对象

原型对象就是 Person.prototype

constructor

每一个原型对象都会有一个 constructor 属性, 这个属性会指向 prototype 属性所在函数,也是就是构造函数 Person

proto

每个对象都有 __proto__ 属性。但只有函数对象prototype 属性

所有函数对象的 __proto__ 属性,都指向 Function.prototype,他是个空函数

所有对象的 __proto__ ,都指向其构造器的 prototype

构造函数与实例原型的之间的关系图

prototype

参考

JavaScript深入之从原型到原型链