js原型与原型链
js的原型分为两种,显示原型( prototype )跟隐式原型(__proto__);
显示原型 : 每个函数在声明时,都会自动创建一个显示原型,默认指向一个空Object对象(即原型对象);
隐式原型 : 每个实例对象在创建时,也会自动创建一个隐式原型(__proto__),实例对象隐式原型的值 == 构造函数显示原型的值
// 定义一个构造函数 function Pr() { // 在函数创建时,会自动创建一个prototype 相当于在函数内添加一条语句 this.prototype = {}: } // 创建实例 var p = new Pr; // 创建实例时,自动创建 __proto__ 即 this.__proto__==Pr.prototype;
原型链的属性问题
查找 : 当在自身中没有找到该属性或者方法,则会自动沿着隐式原型链查找 (原型链也称为隐式原型链),直到原型链的尽头(即Object的原型对象),找到则返回,找不到返回undefined
设置 : 设置属性时,不会牵扯到原型链,当自身中没有该属性,则直接添加此属性并设置值
方法一般定义在原型链中,属性则通过构造函数定义在对象自身
探索instanceof是如何判断的
表达式: A instanceof B
如果B函数的显示原型对象在A对象的原型链上(隐式原型),则返回true,否则返回false
补充
1. 函数的原型对象,默认是一个空的Object对象,但它里面其实是有数据的,它也会有一个隐式原型,值是object的显示原型
因为它也是一个实例对象,是通过new Object产生的,所有它的隐式原型的值==Object的显示原型
2. 函数本身也是一个实例对象,因为它是通过new Function所产生的! 即函数也拥有隐式原型属性,值向Function的显示原型
3.Function的显示原型与它自身的隐式原型相等,因为Function是通过new自身产生的实例
4.Object的原型对象没有隐式原型对象!它的隐式原型的值是null. 所有object的原型对象是原型链的尽头
初学js高级,对js原型链还不太熟悉,欢迎各位大佬补全纠正 2020-06-20