关于创建对象的几个问题,拨云见日

<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   
原文地址:https://www.cnblogs.com/myfirstboke/p/10438756.html