zoukankan      html  css  js  c++  java
  • JavaScript基础知识十三(构造函数)

    构造函数模式和工厂模式的区别?

    1、执行的时候

    普通函数执行-> carFactory();

    构造函数模式-> new CarFactory()

    通过new 执行后,我们的CarFactory就是一个类了

    2、在函数代码执行的时候

    相同:都是形成一个私有的作用域,然后 形参赋值->(运行后)内部成员开始预解释->代码从上到下执行

    (类和普通函数一样,它也有普通的一面)

    不同:在代码执行之前,不用自己在手动的创建obj对象了,浏览器会默认的创建一个对象数据类型的值

    (这个对象其实就是我们当前类的一个实例);

    代码从上到下执行,以当前的实例为执行的主体(this代表的就是当前的实例),然后分别的把属性名和属性值给当前的实例

    最后浏览器会默认的把创建的实例返回

    1.JS中所有的类都是函数数据类型,它通过new执行变成了一个类,但是它本身也是一个普通的函数

       new实例化的对象都是对象数据类型

    2.在构造函数模式中,类中(函数体重)出现的this.xxx=xxx中的this是当前类的一个实例

    3.p1和p2都是CreateJsPerson这个类的实例,所以都拥有writeJs这个方法

    在类中给实例增加的属性(this.xxx==xxx)属于当前实例的私有属性,实例和实例之间的个体,所以私有的属性之间是不相等的

    function CreateJsPerson(name,age){
                   this.name = name;
                   this.age = age;
                   this.writeJs = function(){
                       console.log("my name is "+this.name +",已经"+this.age+"岁啦!!")
                   }
               }
               var p1 = new CreateJsPerson("鲁尼",30);
               p1.writeJs();

     `````````````````````````````````````````````````````````````````````````````````````````

    function Fn(){
                this.x =100;
                this.getX = function(){
                    //this ->需要看getX执行的时候才知道
                    console.log(this.x)
                }
            }
            var f1 = new Fn;
            f1.getX();//->方法中的this是f1->100
            var ss = f1.getX;
            ss();// 方法中的this是window->undefined

    1.在构造函数模式中new Fn()执行,如果Fn不需要传递参数的话,后面的小括号可以省略

    2.this的问题:在类中出现的this.xxx=xxx中的this都是当前类的实例,而某一个属性值(方法),方法中的this

    需要看的方法执行的时候,前面是否有"."才能知道this是谁

    3.类有普通函数的一面,当前函数执行的时候,var num其实只是当前形成的私有作用域中的私有变量而已,它和我们的f1这个实例没有任何的关系

    4.在构造函数模式中,浏览器会默认的把我们的实例返回(返回的是一个对象数据类型的值);如果我们自己动手写了一个return返回:

     返回的是一个基本数据类型的值,当前实例是不变的,例如:return 100;

    我们的f1还是当前Fn类的实例

    返回的是一个引用数据类型的值,当前的实例会被自己的返回的值给替换掉,例如

    :return {name : "XXX"}我们的f1就不在是Fn的实例了,而是对象{name:"XXX"}

    5.检测某一个实例是否属于这个类->instanceof

    f1 instanceof Fn 

    因为所有的实例都是对象数据类型,而每一个对象数据类型都是Object这个内置类的一个实例,所以f1也是它的一个实例

    对于检测数据类型来说,typeof有自己的局限性,不能细分object下的对象、数组、正则..

    6.f1和f2都是Fn这个类的一个实例,都拥有x和getX两个属性,但是这两个属性是鸽子的私有的属性,所以:

    console.log(f1.getX === f2.getX);// false

    console.log("getX" in f1);//true 是它的一个属性

    7.hasOwnProperty:用来检测某一个属性是否为这个对象的"私有属性”,这个方法只能检测私有的属性

    console.log(f1.hasOwnProperty ("getX"));//->true "getX"是f1的私有的属性

    8.思考:检测某一个属性是否为该对象的“公有属性” hasPubProperty

    function hasPubperty(obj,attr){

    //首先保证是它的一个属性并且还不是私有的属性,那么只能是公有的属性了

    return (attr in obj)&& obj.hasOwnProperty(attr);

    }

    console.log(hasPubProperty(f1,"getX"))//

    ??????  isPrototypeOf

  • 相关阅读:
    tensorflow打印输出张量以及tf.one_hot()函数简介
    Windows10下Jupyter Notebook 使用虚拟环境
    图解Windows10下如何更换Jupyter Notebook 内核Python版本(切换原始的python环境)
    听说你在找工作?这里有很多招聘信息~
    数据集难找?GAN生成你想要的数据!!!
    妈妈再也不担心我没壁纸了!
    你的爬虫ip又被封了?教你一招
    飞鸽内网穿透
    第九届全国生物信息学与系统生物学学术大会
    SAP UI5 Routing 路由介绍
  • 原文地址:https://www.cnblogs.com/zzzzzzzsy/p/6688902.html
Copyright © 2011-2022 走看看