好好学习-JS基础-原型/原型链

function Foo () {
    this.name = "name"
    this.age = 18
}
Foo.prototype.sayHi = function () {
    console.log('hello')
}
var foo = new Foo()

foo.name  // name
foo.age   // 18
foo.sayHi() // hello

prototype

每一个构造函数都有一个prototype属性,这个属性指向原型对象,使用构造函数建立实例对象后,这个prototype指向的原型对象就是实例的原型对象.
prototype 是函数才会有的属性git

proto

除了 null 以外,每一个对象都拥有一个隐藏的__proto__属性,指向实例的原型对象.能够用 foo.__proto__ 或者 Object.getPrototypeOf(foo) 来访问.github

实际上构造函数的prototype属性与实例对象的__proto__属性指向的是同一个原型对象.函数

foo.__proto__ === Foo.prototype   // true

constructor

每一个原型对象都有一个constructor属性指向关联的构造函数post

Foo.prototype.constructor === Foo  // true

每一个对象都会从原型继承属性this

根据所述可绘制:原型.pngspa

实例与原型

function Foo () {}
Foo.prototype.name = "Ann"
var foo = new Foo()
foo.name = "ken"
console.log(foo.name)  // Ken
delete foo.name
console.log(foo.name)  // Ann

当读取实例对象的属性时,先在实例对象中查找,若是找不到,就会到实例关联的原型对象中去找,若是原型对象中找不到,就到原型的原型对象中找,一直到最顶层为止..net

原型的原型

原型也是一个对象,那么就能够使用最原始的方法建立:prototype

var obj = new Object()
obj.name = "Ann"
console.log(obj.name)  // Ann

原型对象就是经过 Object 构造函数建立出来的,那么原型对象就能够经过__proto__属性访问到:
原型的原型.png3d

原型链

Object.prototype 的原型是什么呢? 答案是 null,null 表示没有对象,此处不该该有值code

console.log(Object.prototype.__proto__ )  // null

那是什么建立了 Object()这个构造函数呢?

  • 一切对象最终继承自 Object 对象
  • 一切函数对象(包括 Object 对象)最终继承自 Function对象
  • Object对象直接继承自Function对象
  • Function对象继承自本身,最终继承自Object对象

看图:
Function和Object.png

原型链就是图中的蓝色关联

参考文章连接

相关文章
相关标签/搜索