<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