__proto__
和prototype是原生js中比较重要的一环,接下来我从函数和对象,两个方面,谈谈个人理解编程
js函数是原生js比较重要的一环,先来谈谈我对函数的理解,微信
js是函数式编程,最重要的就是prototype
和constructor
函数式编程
首先明确一点,每一个函数都有prototype属性,prototype指向了一个对象,这个对象就叫原型对象。函数
每一个原型对象有一个constructor属性,指向了构造函数自己,spa
光说仍是有点难懂,我先上图prototype
// 代码 function foo() {} // 原型 console.log(foo.prototype); // {constructor: ƒ} // 构造器 console.log(foo.prototype.constructor); // ƒ foo() {}
上面代码和图可知foo的prototype
属性指向一个对象,而后对象有一个属性constructor 又指向了 foo构造函数,看下图:3d
就是这样的关系,不过这个不能单独理解,且听我下面讲完__proto__
属性code
__proto__
属性每一个对象都有__proto__
属性指向构造函数的prototype属性;对象
怎么验证呢?blog
这里首先要先说下建立对象的三种方式了
一、对象字面量(经常使用)
var _obj = {};
二、构造函数Object
var _obj = new Object();
三、经过Object.create(prototype) 初始化对象;
var _o = {}; var _obj = Object.create(_o);
而后 其实这三种方式都调用了Object函数,生成的对象的__proto__
属性,都指向了Object函数的prototype属性
var _obj = {}; console.log(_obj); // _obj.__proto__ 指向了Object的原型对象{……} console.log(_obj.__proto__ === Object.prototype); // true
这样咱们验证出来全部对象都有__proto__
属性,指向了构造函数的原型对象
而后对象的__proto__
和函数的prototype
有什么关系呢?
实例化对象验证
咱们都知道实例化会生成一个对象,对象都有__proto__
属性,指向原型对象,
那就意味着函数的prototype属性,和实例化的__proto__
指向同一个对象,验证下。
// 一、__proto__指向的是【构造函数的prototype属性】 function fnxx(){} // new生成一个实例对象 var _xx = new fnxx(); // 对象的__proto__和函数的prototype console.log(_xx.__proto__ === fnxx.prototype); // true
上面代码跑了以后,结果为true,说明我们验证是正确的😄!
而后这有什么用呢?
看下面
js在建立对象的时候都有__proto__
内置属性,用于指向建立它函数对象的原形对象prototype
没错这就是原型链。
_xx.__proto__.__proto_
…… 沿着__proto__
属性逐层向下查找,这就是一个最简单的原型链,继承的话也是这样一层层向下找。
js中万物皆对象,Function也是对象,全部对象指向了Object对象 ,也就是说Object对象是全部对象的基类;
Object的__proto__
属性指向null;
验证下
function fnxx(){} // 二、对象的__proto__ console.log(fnxx.prototype.__proto__); // 指向Object构造函数的原型对象 console.log(fnxx.prototype.__proto__ === Object.prototype); // true // Object对象是全部js对象的基类 console.log(Object.prototype.__proto__); // null
至此一个完整的链条就很清晰了;
函数都有一个prototype属性,指向原型对象,原型对象有constructor 属性,指向了构造函数自己。
对象有__proto__
属性,指向建立它的原型对象,__proto__
用来实现原型链查找,是继承中关键的一环。
js中最重要的两个概念__proto__
和prototype这里就讲清楚了,你们有啥不懂的,能够评论留言。
接下来我再出几篇,关于继承,还有prototype原型模式的应用。