一. 使用new Object()
创建
//使用object创建一个对象 完全等同于 var person = {};
var person = new Object();
//给对象添加属性
person.name = "李四";
//给对象添加方法
person.eat = function () {
alert("好好吃")
}
二. 工厂模式创建
虽然 Object
构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。
为解决这个问题,人们开始使用工厂模式的一种变体。
工厂模式是软件工程领域一种广为人知的设计模式,
这种模式抽象了创建具体对象的过程,考虑到在 ECMAScript
中无法创建类,
开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节。
function createPerson(name, age, job) {
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function() {
alert(this.name);
};
return o;
}
var person1 = createPerson("张三", 29, "js开发者");
var person2 = createPerson("李四", 27, "java开发者");
createPerson()
函数可以多次调用,
每调用一次这个函数就会返回一个对象,而且对象的类型仍然是Object类型的。
虽然解决了多个相似对象的问题,但却没有解决对象类型识别的问题。
三. 构造函数模式创建对象
为了解决对象类型识别问题,又提出了构造函数模式。
这种模式,其实在我们创建一些原生对象的时候,比如Array、Object
都是调用的他们的构造函数。
看下面的代码
<script type="text/javascript">
function Person (name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.eat = function () {
alert(this.name + "在吃东西");
}
}
var p1 = new Person("张三", 20, "男");
p1.eat(); //张三在在吃东西
var p1 = new Person("李四", 30, "男");
p1.eat(); //李四在在吃东西
alert(p1 instanceof Person); //
</script>
说明:
使用构造函数创建对象,必须使用关键字
new
,后面跟着构造函数的名,根据需要传入相应的参数。其实使用
new 构造函数()
的方式创建对象,经历了下面几个步骤。创建出来一个新的对象
将构造函数的作用域赋给新对象。意味着这个时候
this
就代表了这个新对象。执行构造函数中的代码。 在本例中就是给新对象添加属性,并给属性初始化值。
构造函数执行完毕之后,默认返回新对象。 所以外面就可以拿到这个刚刚创建的新对象了。
四. 构造函数和普通函数的关系
他们都是函数。
构造函数也是函数,也可以像普通的函数一样进行调用。
做普通函数调用的时候,因为没有创建新的对象,所以this其实指向了window对象。
function Person(){ this.name = "张三"; // 把name属性添加到了window对象上面 alert(this === window); //如果不作为构造方法调用,则 是true } Person(); // 把构造函数当做普通方法调用。这个时候内部的this指向了weindow alert(window.name); //张三 function Human(){ this.name = "王五"; alert(this instanceof window); // false alert(this instanceof Human); //true } var h = new Human(); //当做构造函数来调用,创建一个对象 alert(h.name);
构造函数和普通函数仅仅也仅仅是调用方式的不同。
也就是说,随便一个函数你如果用
new
的方式去使用,那么他就是一个构造函数。为了区别,如果一个函数想作为构造函数,作为国际惯例,最好把这个构造函数的首字母大写。