接触JS一年多,总是混淆它们之间的关系,这次偶然看到一篇博客,写得简略但是思路很清晰,结合自己在红宝书上看到的内容,故作此记录。
若有不当,请多多指教。
欲解决问题:定义在构造函数外部的全局函数只能被某个对象调用,这让全局函数 有点名不副实。
问题来了:如果对象需要定义很多的方法,那么就需要定义很多的全局函数,这样的话,这个自定义的引用类型就没有 封装性 可言了。
所以,可以用 原型模式 来解决此问题。
prototype 本义:原型;雏形;最初形态
代码展示如下所示
function Person() {
}
var person = new Person();
console.log(person.__proto__ == Person.prototype) // true
console.log(Person.prototype.constructor == Person) // true
// 顺便学习一个ES5的方法,可以获得对象的原型
console.log(Object.getPrototypeOf(person) === Person.prototype) // true
实例与原型
当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。
原型的原型
实例的 proto 指向构造函数的 prototype ,
原型链
那 Object.prototype 的原型呢?
null,我们可以打印:
console.log(Object.prototype.__proto__ === null) // true
null 表示“没有对象”,即该处不应该有值。
所以 Object.prototype.proto 的值为 null 跟 Object.prototype 没有原型,其实表达了一个意思。
所以查找属性的时候查到 Object.prototype 就可以停止查找了。