JavaScript学习——面向对象(一)——创建对象(工厂模式和构造器模式)
创建对象
使用object函数和对象字面量可以创建对象,但是这两种方法也有明显的不足:如创建具有相同接口的多个对象需要编写很多重复的代码。es6提供了类和继承,注意:这个是封装了es5构造函数加原型继承的语法糖而已;
创建对象的方式:
1,使用工厂模式创建对象:
使用工厂模式创建对象就是创建一个Object对象,再给对象添加属性和方法,工厂模式虽然解决了创建多个相同的对象创建的问题,但是不能识别对象的类型。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>创建对象的几种方式-工厂模式</title> <script> function createPerson(name,age,job){ var obj=new Object(); obj.name=name; obj.age=age; obj.job=job; obj.sayName=function(){ alert("我的名字是"+this.name); } return obj; } var person1=createPerson("猪八戒",28,"医生"); var person2=createPerson("孙悟空",18,"教师"); </script> </head> <body> </body> </html>
2,使用构造器模式创建对象
function Person(name, age) {
this.name = name
this.age = age
this.say = function () {
console.log(this.name)
}
}
let p1 = new Person('张三', 20)
let p2 = new Person('张三', 39)
p1.say()
p2.say()
从代码可以看出,构造模式和工厂创建的对象的区别是:
没有显示的创建对象
直接将属性和方法赋值给了this对象
没有return语句
创建构造函数的注意事项:构造函数的名称第一个字母应该大写,普通 的函数的名称都是小写,构造本身也是函数,也能够被调用。
使用构造函数创建一个对象必须要使用new操作符,使用new操作符调用构造函数经历的4个步骤:
创建一个新对象
将构造函数的作用域赋值给新对象(this指向了这个对象)
执行构造函数中的代码(为对象添加属性和方法)
返回一个新的对象
构造函数也是一个函数
构造函数和其他函数的不同就是调用方法不同,除此之外,构造函数也是函数,并没有把某个函数定义为构造函数的特殊语法,任何函数只要使用了new操作符都可以当做构造函数来使用,如果不适用new操作符,那么就是当做普通函数来使用的,因此前面的构造函数也可以当做普通的函数来进行调用:
function Person(name, age) { this.name = name this.age = age this.say = function () { console.log(this.name) } } Person('李四', 20)
这个时候this指向是window,在调用一个函数并且没有特定的指向的时候,this对象始终是执行window的,如果是使用了call或者是apply等,那么this就是指向了那个对象。