> 文章列表 > 原型、原型链

原型、原型链

原型、原型链

一、 原型 prototype

也许大家不爱看很长的字,我就是,所以我先来个总结,要想知道原理吧算是,就阅读总结后的东西就知道了

总结:

1.什么是原型?

2.什么是原型链?

原型:每个对象身上都有一个属性prototype,这个prototype属性指向一个对象,这个对象就是原型

原型链:当访问一个对象的属性或方法时,我们先在这个对象身上查找,有就用,没有就去对象的原型对象上查找,原型对象身上没有,(原型对象也是个对象呀,也有原型),再去原型对象的原型上找,直到找到Object对象的原型,Object对象的原型就没有原型了,如果在Object对象的原型中都还没找到,就返回undefined,就这样一层一层的往上查找,就是原型链

 

正文:

我们每创建一个函数(要知道函数也是一个对象),解析器就会向函数里添加一个属性prototype

 function Person() {}function Dog() {}console.log(Person.prototype == Dog.prototype); //false 每一个函数,都有自己的prototype

这个属性prototype,对应着一个对象,这个对象就是原型       

 function Dog() {// 属性:prototype---->对应这一个对象----->对象(原型对象)}

如果函数作为普通函数调用,prototype没有任何作用

当函数以构造函数形式调用时,他所创建的对象中都有一个隐含属性,指向该构造函数的原型对象,通过__proto__可以访问到

 function Dog() {}let d = new Dog()let d2 = new Dog()

也就是说构造函数创建出来的对象d,里面有个__proto__, 函数Dog里面有个prototype,他们都指向同一个地方

    console.log(d.__proto__ == Dog.prototype); //trueconsole.log(d2.__proto__ == Dog.prototype); //true
Dog.prototype.a= '123'
console.log(d.a)//123

图解:

当我们访问一个对象的属性或方法时,他会先在对象自身中寻找,如果有,直接使用自身的,自身没有,才会去原型对象中寻找

原型对象中没有去原型对象的原型上找,直到找到Object对象的原型

Object对象的原型没有原型,如果在Object对象的原型中还没找到,就返回undefined

作用:

以后我们创建构造函数时,可以将这些对象中共有的属性和方法,统一添加到构造函数的原型对象中,

 这样不用分别为每一个对象添加,也不会影响全局作用域,就可以使每个对象都具有这些属性和方法了

二、原型链

这样一层一层的往上查找就是原型链

自从读了小呆作者的文章,妈妈再也不用担心面试官问我的问题!(自己瞎说)