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

原文地址:https://www.cnblogs.com/zzzzzzzsy/p/6688902.html