zoukankan      html  css  js  c++  java
  • 关于创建对象的几个问题,拨云见日

    <script>
    //    常见的三种创建对象的方式
    //    1.通过”字面量“方式创建
        var a={
            name:'詹姆斯'
        }
        console.log(a)
    
        /**************************************工厂模式****************************************************/
    //上面的方式中通过字面量或者new 等方式只能创建单一的对象
    //    3.工厂模式(就是写一个函数,函数里面return 对象出来,可以反复调用)
        function Person() {
                var person=new Object()
                person.name='安东尼'
                person.age=33
                return person
            }
            var andongni=Person()
            console.log(andongni)//这就是工厂模式,说白了还是一个对象,只不过这个对象是通过函数return 出来的,变量接受这个函数就相当于变量=对象
    
    //        上面这个工厂模式在改动一下
            function PersonBaby(name,age) {
                var person=new Object()
                person.name=name||'我是默认的名字'//默认不传递参数对应的默认的name,待会文章末尾会有一个链接教你的
                person.age=age||23
                return person
            }
            var andongniBaby=PersonBaby()
            console.log(andongniBaby)//age: 23 name: "我是默认的名字"  这是不传递参数的情况下
    
            var boss=PersonBaby('boss',55)
            console.log(boss,'有参数的情况下肯定取参数啊')
    
    
    /**********************************构造函数********************************************************/
    
    //  3.通过”构造函数“方式创建。特点  开头是大写的哟
    function Person() {
        this.name = "dongjc";    //通过this关键字设置默认成员
        var worker = 'coding';    //没有this关键字,对象创建后,该变量为非成员,不会出现在新建的对象里面
        this.age = 32;
        this.Introduce = function () {
            alert("My name is " + this.name + ".I'm " + this.age);
        };
        console.log("My name is " + this.name + ".I'm " + this.age);
    };
    var person = new Person();
    console.log(person)
    //当然你也可以不固成员,同工厂模式一样写参数
    
    //此代码一共会两次console,原因在于创建对象是自动执行了该函数。
    //注意:this关键字的使用。这里的this与php中话法意思类似,指调用该函数的对象,这里指的是person。
    
    /*
    * 与工厂模式相比,具有以下特点:
     没有显式创建对象;
     直接将属性和方法赋给了this对象;
     没有return语句;
     要创建新实例,必须使用new操作符;(否则属性和方法将会被添加到window对象)
     可以使用instanceof操作符检测对象类型
       构造函数的问题:
       构造函数内部的方法会被重复创建,不同实例内的同名函数是不相等的。可通过将方法移到构造函数外部解决这一问题,但面临新问题:封装性不好。
       这些问题可通过原型模式解决。
    * */
    /*********************************原型模式**********************************************/
    //原型模式 说白了就是弄个构造函数然后改变这个构造函数的prototype,然后在new 这个构造函数
    function Baby(){
    }
    //如果我这里吧Baby 改成小写行不行呢?说白了这就是考构造函数和普通函数的区别
    Baby.prototype.name="bitch";
    Baby.prototype.age=29;
    Baby.prototype.sayName=function(){
       console.log(this.name,'我是原型模式里面的sayName函数')
    };
    var person1=new Baby();
    console.log(person1,'我是Baby 原型模式new出来的')
    person1.sayName();//"bitch"
    </script>
    

      

    上面两处标红的地方,先解释第二个

    构造函数和普通函数的区别

      任何函数,只要通过 new 操作符来调用,那它就可以作为构造函数 ;构造函数开头大写

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

       function Person(name,age,job){
            this.name = name;
            this.sayName = function(){
                alert(this.name);
            }
        }
        //当做构造函数使用
        var person = new Person('Nicholas');//this-->person
        person.sayName();//'Nicholas'
        //当做普通函数调用
        Person('Greg');//this-->window
        window.sayName();//'Greg'
    

      构造函数当普通函数调用的话 this 指向window,当构造函数调用,this指向实例化这个变量,为啥this的指向不同呢?

    原因:构造函数内部会创建一个实例,调用普通函数时则不会创建新的对象。构造函数内部的this指向是新创建的person实例,而普通函数内部的this指向调用函数的对象(如果没有对象调用,默认为window)

    默认不传递参数对应的默认的name,待会文章末尾会有一个链接教你的(我的下一篇文章) https://www.cnblogs.com/myfirstboke/p/10438890.html   
  • 相关阅读:
    nginx防止盗链
    Nginx防盗链详细设置
    [bzoj2127]happiness
    [bzoj2400]Optimal Marks
    [bzoj1738]发抖的牛
    [bzoj1741]穿越小行星群
    [bzoj3123]森林
    [bzoj2588]Count on a tree
    [bzoj3144]切糕
    [bzoj1787]紧急集合
  • 原文地址:https://www.cnblogs.com/myfirstboke/p/10438756.html
Copyright © 2011-2022 走看看