拾遗记2:js原型链

原型(对象属性)

在JavaScript中,每个函数都有一个对象属性(prototype),其指向另外一个对象。函数

为什么要设计prototype对象属性?
JavaScript语言在设计时,其设计师不想将这门语言设计的过为复杂,不想提升语言学习门槛,所以没有引入类。可是其借鉴了new关键字,经过new关键字加构造函数的方式建立实例对象。若是只有构造函数,那么怎么实现多个实例对象之间共享属性和方法呢?为了实现共享,设计师为构造函数添加了prototype属性,该属性指向一个对象,全部实例之间共享的属性和方法就放在这个对象上,不须要共享的属性和方法就放在构造函数里面,实例对象在建立完成以后,将自动引入prototype对象的属性和方法。学习

function Person(name) {
    this.name = name
}
// 原型上添加一个共享方法
Person.prototype.say = function () {
    console.log(`my name is ${this.name}`)
}
let zs = new Person('zhangsan')
// 实例对象能够访问原型上的共享方法
zs.say()

原型链

在原型中咱们得知,全部的构造函数都有一个prototype属性,由此构造函数建立的实例对象都能自动获取prototype上面共享的属性和方法。那么实例对象是如何获取的?实例对象都有实例对象和原型之间的一种连接,也就叫原型链。this

function Person(name) {
    this.name = name
}
Person.prototype.say = function () {
    console.log(`my name is ${this.name}`)
}
let zs = new Person('zhangsan')
// 实例对象proto属性指向构造函数的原型
console.log(zs.__proto__ === Person.prototype) // true

因为原型也是一个对象,能够看做是Object的一个实例,所以,其__proto__属性指向Object的原型。prototype

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

因为全部function都是由Fucntion生成的,也就是全部的函数能够看做是Function的实例对象,所以函数的__proto__指向Function的原型。设计

console.log(Person.__proto__ === Function.prototype) // true

constructor

在每一个函数的原型prototype中都有constructor属性,它保存了对函数的引用。code

console.log(Person.prototype.constructor === Person)

// 因为constructor保存了一个引用,所以能够用其实例化一个对象
let lisi = new Person.prototype.constructor('lisi')
lisi.say()
相关文章
相关标签/搜索