1. 工厂方法创建对象
【概述】:工厂方法对象,就是通过一个方法来构建对象,在构建对象的属性的时候,通过形参来给对象的属性赋值,然后最后返回这个对象。
【代码示例】
function factoryMode(name,age,skill){
var obj = {
name:name,
age:age,
skill:skill,
showSkill:function(){
console.log(name+ '\'s skill is '+this.skill);
}
}
return obj;
}
var obj1 = factoryMode('haduo',22,'basketball');
var obj2 = factoryMode('Yang',21,'sleep');
var obj3 = factoryMode('Cui',22,'study');
var obj4 = factoryMode('Guo',22,'deeplearning');
obj1.showSkill();
obj2.showSkill();
obj3.showSkill();
obj4.showSkill();
console.log(obj1);
输出结果
haduo’s skill is basketball
Yang’s skill is sleep
Cui’s skill is study
Guo’s skill is deeplearning
【注】工厂模式创建的对象类型都是Object,如果分不清楚不同对象
2.构造函数
【构造函数执行流程】 :
- 立即创建一个新的对象
- 将新建的对象设置为函数中的【this】,在构造函数中可以使用this来引用新建的对象。
3.逐行执行函数中的代码- 将创建的对象作为返回值返回
【代码演示】
function Person(name,age,skill){
this.name = name;
this.age = age;
this.skill = skill
this.show = function(){
console.log(this.name+'\'s skill is '+this.skill);
}
}
var person1 = new Person('haduo',22,'basketball');
console.log(person1);
person1.show();
【输出结果】
这里我们明显的看到,对象名变成了Person,于工厂模式的明显不同。
- 使用同一构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类
- 我们将通过一个构造函数创建的对象,称为是该类的实例
以上构造函数任存在一些问题
我们每次创建一个person对象,在person对象实例中就会创建一个新的方法,我们可以吧这个方法剥离出去
function Person(name,age,skill){
this.name = name;
this.age = age;
this.skill = skill
this.show = fun;
}
function fun(){
console.log(this.name+'\'s skill is '+this.skill);
}
但是这种方法不安全,尽量不要在全局作用域中定义
原型prototype
我们所创的每一个对象,解析器都会向函数中添加一个属性prototype,这个属性对应着一个对象,这个对象就是我们所谓的原型对象
- 如果函数当做普通函数调用的时候,prototype没有任何作用
- 当函数以构造函数的形式调用的时候,它所创建的对象都会有一个隐含的属性指向该构造函数的原型对象,我们可以通过__proto__来访问该属性
- 原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象*有的内容,统一设置到原型对象中
- 当我们访问队形的一个属性或方法的时候,它会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,如果找到,则直接使用
- 以后我们创建构造函数的时候,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,这样不用分为别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法了
function Person(name,age,skill){
this.name = name;
this.age = age;
this.skill = skill
};
Person.prototype.show = function(){
console.log(this.name+'\'s skill is '+this.skill);
};
var person1 = new Person('haduo',22,'basketball');
var person2 = new Person('Ynag',21,'joking');
person2.show();
person1.show();