个人对原型对象的理解

显式原型:prototype 指向函数的原型对象
隐式原型:__proto__ 也指向函数的原形对象

1. 每个 函数function 都有一个prototype,即显式原型;
function Fn(){
}
console.log( Fn.prototype )
:通过Function.prototype.bind方法构造出来的函数是个例外,它没有prototype属性。

2. 每个 实例对象 都有一个__proto__,可称为隐式原型
var fn= new Fn()
console.log( fn.__proto__ )
:Object.prototype 这个对象是个例外,它的__proto__值为null 

3. 对象的隐式原型的值为其对应构造函数的显式原型的值
console.log( Fn.prototype===fn.__proto__ )
//返回true
4. 内存结构(图)(原型链)(此原型链图不太完整,可自行百度)

原型链:尽头为Object的原型对象

  • 显式原型的作用:用来实现基于原型的继承与属性的共享
  • 隐式原型的作用:构成原型链,同样用于实现基于原型的继承。举个例子,当我们访问obj这个对象中的x属性时,如果在obj中找不到,那么就会沿着__proto__依次查找(查找对象的属性)
  • Fn.prototype和fn.__proto__ 保存的同一个地址值,这个地址指向一个obj空对象(即原型对象)
原型对象中的construtor属性,指向函数对象;
例子: Fn.prototype.test=function(){alert(1);} //在原型对象中添加test方法 (属性)
fn.test(); //(fn本身没有test方法, 沿着__proto__依次查找 ) //找到原型对象中test方法 (属性)
fn.toString(); //找到Obejct原型对象中toString方法 (属性)

5. 总结:
* 访问一个对象的属性时,先在自身属性中查找,找到返回, 如果没有, 再沿着__proto__这条链向上查找, 找到返回,如果最终没找到, 返回undefined,直接调用则报错;
* 程序员能直接操作显式原型, 但不能直接操作隐式原型(ES6之前)

猜你喜欢

转载自blog.csdn.net/Chen_start02/article/details/79381789
今日推荐