构造器constructor

2019-04-29  本文已影响0人  bozhao

为了方便你理解prototype,我们可以把ECMScript分两大类:函数对象

什么是函数?什么是对象?
函数就是带括号()这种,比如 Function()、Object()、Date()、Number()、Boolean()、Array(),
对象就是不带括号()进行使用的。例如:Function、Object、Date、Number、JSON、Math,
所以Function既可以当函数又可以当对象
所以Object只是一段有属性的native function
所以我们所说的js数据类型如图所示:

js数据类型
以上类型除了空和未定义,他们都有两种形态,既可以加上括号当函数来使用,也可去掉括号当对象使用。
理解即是对象又是函数很重要

我们先说说Function是怎么回事,Function是一个神奇的代码片段,这个代码片段——Function,是可以当对象来使的,那Function这个对象自身有啥属性了?

Function.hasOwnProperty('prototype') // true
Function.hasOwnProperty('name') // true
Function.hasOwnProperty('length') // true
//hasOwnProperty(prop)是个啥?是检测对象**自身属性**上有没有prop属性或方法
// 懂啥意思了吗,我们再来试试

Function.hasOwnProperty('hasOwnProperty')  // false
// false ? 居然是false 那hasOwnProperty是怎么来的?我们先放一放。

以下开始了,请 注意:
Function这个神奇的代码是由谁构造出来的?

Function.constructor === Function // true 是自己
//constructor是啥?对象的属性?方法?他的内部猜是这样的
{
      constructor:function(){} // 所以你说constructor是啥 ,算了就叫属性吧
}

上面代码块的意思,有一个对象,对象里面有一个 constructor属性, constructor属性的值是个function,而这个function就是构造器=>构造函数
直接说吧,constructor这个东西,他的意思就是对象是由谁?构造出来的。此时的Function是当作对象来使用的,我们自己写的函数,也会有一个constuctor,他也是Function这段函数构造出来的,我们自己写的对象,也有一个constuctor,他是Object这段函数代码构造出来的

console.log(Function.constructor)  // function(){}  

没错Function对象的constructor是一个函数,而这个函数就是Function,他是一串神奇的代码,这个神奇的代码,他只是单纯的一段代码,一段神奇代码。

constructor也和hasOwnProperty一样都不是Function对象自身的属性

知道了Function对象是谁构造出来的,那Object是由谁构造出来的?

Object.constructor === Function // Function()函数构造器=>构造函数,是一串native代码

Number.constructor === Function // Function() //如你所想
// Object、Function 等他们的构造器就是那段神奇的代码,那段神奇的代码创造了他们

注意哈,到目前为止我们还没有疏理prototype的概念。
我们先画一张构造图

构造图

以上至少说明。

1 Function是一串native代码,注意这段代码也是有属性的哈

2 Function这段有属性的函数代码构造出了Object这段同样带有属性的函数代码,也构造出了String这段既可以当对象使用的也可以当函数片段使用的代码

3 JSON、Math也是由Object这段代码构造的。但是JSON不是一个方法,他是纯纯纯对象

4 Object构造出来的东西只能是对象,而Function构造出来的既能是对象也能是函数

5 underfund,null之外你能看到的绝大部分东西要么是Function直接构造出来的要么是Object构造出来的

6 Object又是Function构造出来的。但是最重要你自己写的new 一个func 这样构造出来的是一个纯对象,他虽然是一个普通funcion函数构造出来的,但不是直接由Function构造出来的,所以只是纯对象

本文说了这么多,只要了解了纯对象形态和 即是函数又是对象形态就好了

上一篇下一篇

猜你喜欢

热点阅读