面向对象是一种思维方式,是把解决问题的关注点放到解决问题的一系列对象上。与之对应的是 面向过程 ,面向过程也是一种思维方式,是把解决问题的一些关注点放到解决问题的每一个详细的步骤上。
可以通过以下几种方式创建对象:
1.通过字面量创建对象
var obj = {
name:"aaa",
singer:"bbb"
};
var obj1 = {
name:"xxx",
singer:"yyy"
};
格式:{key:value, key:value ... }
使用这种方法每次只能创建一个对象,复用性较差。若想要创建多个对象,代码冗余度太高。
2.使用内置构造函数(JS自带的函数)创建对象
var obj = new Object();
obj.name = "aaa";
obj.singer = "bbb";
var obj1 = new Object();
obj1.name = "xxx";
obj1.singer = "yyy";
使用这种方法创建出来的对象都是空的对象,要手动添加属性,会造成代码重复。
3.封装简单的工厂函数
function createObj() {
var obj = {};
obj.xx = xxx;
return obj;
};
这种方法虽然能够解决代码重复的问题,但是并没有解决对象识别的问题,即怎样知道一个对象的类型。所以这种方法现在也已经不推荐使用了。
4.构造函数
先定义一个普通函数,然后用关键字new
来调用这个函数,并返回一个对象,该函数就变成了一个构造函数,它绑定的this
指向新创建的对象,并默认返回this
。也就是说,不需要在最后写return this
。
function Person(name,age){
this.name = name;
this.age = age;
this.sayHello = function() {
console.log("Hey,man!");
};
}
var stu1 = new Person("aaa",20);
如果忘记写关键字new
,在严格模式下,this.name = name
将报错,因为this绑定为undefined
。在非严格模式下,this.name=name
不报错,因为this
绑定为window
。于是无意间创建了全局变量name
,并且返回undefined
,结果会更糟糕。所以调用构造函数的时候千万不要忘记写new
。为了区分普通函数和构造函数,按照约定,构造函数首字母应当大写,而普通函数首字母小写,这样一些语法检查工具会帮助你检测到漏写的new
。
欢迎查看我的另一篇文章 使用原型解决构造函数存在的问题 (传送门在这里~)