关于原型链的一些理解

问题:

    什么是构造函数以及作用?

    构造函数与普通函数区别是什么?

    用new关键字的时候到底做了什么?

    构造函数有返回值怎么办?

    构造函数能当普通函数调用吗?


1.什么是构造函数以及作用?

    (说人话的解释:构造函数,就是一个普通的函数,与其他函数没有任何区别,可以理解为 函数==构造函数,它只是概念上的一个定义,使用它用来实例化对象。)

     作用:普通函数作为完成一个功能而存在,比如,实现一个加法功能的函数add;而构造函数里有属性和方法)

    概念性解释:JavaScript的构造函数并不是作为类的一个特定方法存在的;当任意一个普通函数用于创建一类对象时,它就被称作构造函数,或构造器。一个函数要作为一个真正意义上的构造函数,需要满足下列条件:

    1、 在函数内部对新对象(this)的属性进行设置,通常是添加属性和方法。

    2、 构造函数可以包含返回语句(不推荐),但返回值必须是this,或者其它非对象类型的值。


2.构造函数与普通函数区别是什么?

   说人话的解释:任何函数,只要通过 new 操作符来调用,那它就可以作为构造函数 ;

                       任何函数,如果不通过 new 操作符来调用,那它跟普通函数也没有什么两样。

例子:

     对于函数 function fn() { }:

     构造函数:1. var f = new fn( );

                     2 .构造函数内部会创建一个新的对象,即fn的实例f

                     3. 函数内部的this指向 新创建的fn的实例f

                     4. 默认的返回值是fn的实例f

     普通函数:1. fn( );

                     2. 在调用函数的内部不会创建新的对象

                     3. 函数内部的this指向调用函数的对象(如果没有对象调用,默认是window)

                     4. 返回值由return语句决定 


3.用new关键字时到底做了什么(以上面的构造函数为例)

var f  ={};    //1.第一步,创建一个空对象。

f.__proto__ = fn.prototype;    //2.第二步,将构造函数fn()中的this指向新创建的对象f。

fn.call(f);    // 3.第三步,将f的_proto_属性指向fn构造函数的prototype,创建对象和原型间关系

return f;    // 4.第四步,返回新对象f。

抽象理解:

第一行,创建一个空对象obj。

第二行,将这个空对象的__proto__成员指向了构造函数对象的prototype成员对象,这是最关键的一步。(理解第二步的作用:将新生成的对象的__prop__属性赋值为构造函数的prototype属性,使得通过构造函数创建的所有对象可以共享相同的原型。这意味着同一个构造函数创建的所有对象都继承自一个相同的对象,因此它们都是同一个类的对象。)

第三行,将构造函数的作用域赋给新对象,即构造函数中的this指向新对象obj,然后再调用构造函数,这样就给obj对象赋值了成员变量。

第四行,返回新对象obj。


4.构造函数有返回值怎么办?

    构造函数有一个默认的返回值:即新创建的对象(实例);

    当手动添加返回值后(return语句):

        1. 返回值是基本数据类型-->真正的返回值还是那个新创建的对象(实例)

        2. 返回值是复杂数据类型(对象)-->真正的返回值是这个对象 

例子:

<script>

  function Fun1() {

    var f2 = new Fun2();

    console.log(f2);  //返回{a: 3}

    console.log(this); //window

    return true;

  }

  function Fun2() {

    console.log(this); //Fun2类型的对象 不是Fun2函数

//    this.age = 30;

    return {a: 3};

  }

  var f1 = Fun1();

  console.log(f1); // true

</script>

5.构造函数可以当普通函数使用吗?

可以。

猜你喜欢

转载自blog.csdn.net/weixin_40135101/article/details/81360024