原型链:原型链是原型对象创建过程的历史记录,当访问一个对象的某个属性时,会先在这个对象本身的属性中查找,如果找不到的话,沿着对象的__proto__属性查找,也就是构造函数的prototype,如果还找不到,继续沿着构造函数的__proto__属性查找,这样一级一级向上查找就会形成一个链式结构。找不到的话返回undefined
hasOwnProperty 函数:可以用来检查对象自身是否含有某个属性,返回值是布尔值,当属性不存在时不会向上查找对象原型链,hasOwnProperty是 JavaScript 中唯一一个处理属性但是不查找原型链的函数
getOwnPropertyNames 函数:可以获取对象所有的自身属性,返回值是由对象自身属性名称组成的数组,同样不会向上查找对象原型链
一直往上层查找,直到到null还没有找到,则返回undefined
Object.prototype.proto === null
所有从原型或更高级原型中的得到、执行的方法,其中的this在执行时,指向当前这个触发事件执行的对象
js的原型是为了实现对象间的联系,解决构造函数无法共享数据而引入的一个属性。而原型链是一个实现对象间联系(即继承)的主要方法。
原型与原型链的常见面试题
-
谈谈你对原型的理解? 在js中,每定义一个对象(函数也是对象),这个对象都会包含一些预定的属性。每个函数对象有prototype属性,这个属性指向函数的原型对象,使用原型对象的好处就是所有对象实例可以共享它的属性和方法
-
什么是原型链?原型链解决的是什么问题?
- 原型链解决的主要是继承问题
- 每个对象都拥有一个原型对象,通过__proto__指向其原型对象,每个原型对象也可能有原型,这个一层一层,最终指向null(Object.prototype.proto==null),这种关系成为原型链。通过原型链,一个对象可以拥有定义在其他对象中的属性和方法。
- prototype 和 proto 区别是什么?
- prototype是构造函数的属性
- proto是实例对象的属性,可以访问构造函数的prototype属性
- 实例的proto和其 构造函数的prototype指向的是同一个对象
每个函数中都有一个prototype属性,属性值是一个对象 ,这个对象叫原型对象。
每个对象中有一个constructor属性,属性的值指向创建这个对象的函数的本身(构造器的本身)。
每个对象中有一个__proto__属性,属性值指向创建这个对象的函数的原型prototype