<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