面向对象--原型与原型链

565 阅读1分钟

原型与原型链

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)

原型链、构造函数、实例对象的关系 :

未命名文件.png

思考

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

结束

这是我的学习笔记,可能有一些不足,如有错误,欢迎指正,一起学习进步。 最后,篮网总冠军!