我的博客排版更佳:https://haonancx.github.io/git
JavaScript 中,万物皆对象!但对象也是有区别的,主要分为普通对象(Object)和函数对象(Function)。github
说好的只聊技术,怎么聊上我的问题了!?网络
好了,安慰一下,请你吃下面 这道菜!函数
function example(){}; var example2 = function(){}; var example3 = new Function('str','console.log(str)'); var other = {}; var other2 =new Object(); var other3 = new example(); console.log(typeof other); //object 下面检测一下他们都是些什么类型函数 console.log(typeof other2); //object console.log(typeof other3); //object console.log(typeof example); //function console.log(typeof example2); //function console.log(typeof example3); //function
怎么区分普通对象和函数对象呢?!其实很简单,凡是经过 new Function() 建立的对象都是函数对象,其余的都是普通对象;因此 other、other二、other3 为普通对象,而 example、example二、example3 为函数对象。测试
在 JavaScript 中,每当定义一个函数对象时候,对象中都会包含一些预约义的属性(意思就是这个函数对象一旦被定义就必然会有这些属性)。this
其中函数对象的一个属性就是原型对象 prototype;这个属性会指向函数的原型对象。spa
默认状况下每一个原型对象又都会获取一个 constructor 属性,这个属性包含一个指向 prototype 属性所在函数的指针。prototype
来来来,了解完对象,咱们该开车上路了(老司机秒懂)指针
function Dogs(){ } Dogs.prototype.name = "Collie"; Dogs.prototype.age = 3; Dogs.prototype.DogsName = function(){ alert(this.name); }; var DogsA = new Dogs(); DogsA.DogsName();//"Collie"
上面的代码中,建立了一个 Dogs 函数,这时候它就会拥有一个 prototype 属性,这个属性指向了 Dogs Prototype 原型对象,而这个原型对象拥有一个 constructor (构造函数) 属性,其指针指向了 Dogs,就是 prototype 属性所在的函数 Dogs;当你建立一个对象实例( DogsA,就是这条语句:var DogsA = new Dogs(); )的时候,一样会拥有一个 prototype 属性;这个 prototype 属性会指向其原型对象,而不是直接指向其构造函数 Dogs。code
咱们能够测试一下,以上面的代码为例:
console.log(DogsA._proto_ === Dogs.prototype) //true
一样,Dogs.prototype对象也有 _proto _ 属性,它指向建立它的函数对象(Object)的 prototype
console.log(Dogs.prototype._proto_ === Object.prototype) //true
好了继续,Object.prototype对象也有 _proto _属性,但它比较特殊,为 NULL
console.log(Object.prototype._proto_) //null
咱们把这个有 proto 串起来,直到 Object.prototype.__proto_ _为 NULL 的链就叫作原型链。
原型和原型链是 JS 实现继承的一种模型。
原型链的造成是真正是靠 _proto _ 的,而不是 prototype。
全部的原型对象都有 constructor 属性,该属性对应建立全部指向该原型的实例构造函数。
函数对象和原型对象经过 prototype 和 constructor 属性进行相互关联。