原型和原型链
555 死记硬背一下内容:
- 所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(null除外)
- 所有的引用类型(数组、对象、函数),都有一个
__proto__
属性,属性值是一个普通的对象 - 所有的函数,都有一个
prototype
属性,属性值也是一个普通的对象 - 所有的引用类型(数组、对象、函数),
__proto__
属性值指向它的构造函数的prototype
属性值 - 实例的隐式原型 === 构造函数的显示原型, 即:
person.__proto__ === Person.prototype
, person:实例,Person:构造函数 - 找一个引用类型的属性 找不到就找他爸(构造函数) 的prototype 再找不到就继续找他爷爷 一直 往上找 最后找到 Object.prototype.proto === n
创建一个构造函数对象
创建一个构造函数 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