原型与原型链
proto与prototype
从上一篇的原型继续讲起
所有的函数都会有prototype原型属性
每个对象都会有一个属性__proto__指向构造函数的 prototype 原型对象 ,因为对象的__proto__和它的构造函数的prototype在都是引用的同一个内存地址,因此他们是完全相等的
function Ninja(name, age){
this.name = name;
this.age = age;
}
Ninja.prototype.run = function () {
console.log('run')
}
let Naruto = new Ninja('Naruto', 18)
console.log(Naruto.__proto__ === Ninja.prototype) // true
__proto__又叫隐式原型, prototype又叫显式原型
我们可以通过__proto__去访问(使用)一个对象的构造函数的 prototype原型里面的方法
原型链
当访问一个对象的某个方法时,首先会先在这个对象本身上查找有没有这个方法,如果没有找到,就会去它的__proto__(构造函数的prototype)上查找,如果依旧没有找到就会在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为
原型链。
原型链的最顶层就是Object.prototype.__proto__ (null)
原型链、构造函数、实例对象的关系 :
思考
1.Object,Array,Boolean, 这些内置函数对象的__proto__是什么呢
答案是Function.prototype ,这是因为这些构造函数也是由Function去构造出来的
console.log(Object.__proto__ === Function.prototype) // true
console.log(Array.__proto__ === Function.prototype) // true
console.log(String.__proto__ === Function.prototype) // true
2.Function.__proto__等于什么
答案是Function.prototype, 上文说到对象的__proto__指向这个对象的构造函数的
prototype,那Function是个函数对象,于是便有了
console.log(Function.__proto__ === Function.prototype) //true
结束
这是我的学习笔记,可能有一些不足,如有错误,欢迎指正,一起学习进步。 最后,篮网总冠军!