JS 对象(4)—构造函数

接上篇 JS 对象(1)—对象详解

 

构造函数模式

 

构造函数

 1 function Person(name,age){
 2     this.name = name;
 3     this.age = age;
 4     this.sayName = function(){
 5         alert(this.name);    //在逻辑上等价于    this.sayName = new Function(alert(this.name));
 6     };
 7 };
 8 var person = new Person("CC",23);
 9 console.log(person.name);    //"CC"
10 console.log(person.age);     //23

 

构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。

要创建Person的新实例,必须使用new操作符;以这种方式调用构造函数实际上会经历以下4个步骤:

(1)创建一个新对象;

(2)将构造函数的作用域赋给新对象(因此this就指向了这个新对象);

(3)执行构造函数中的代码(为这个新对象添加属性和方法);

(4)返回新对象。

 

通过new操作符后跟构造函数的方式创建的对象(实例),这个对象有一个constructor(构造函数)属性,该属性指向构造函数Person。

创建的对象,毫无疑问是Person的实例,同时也是Object的实例;所有对象皆继承自Object。

构造函数是定义在Global对象中的,在浏览器中,即为window对象。

 

构造函数也是函数

任何函数,只要通过new操作符来调用,那么它就可以作为构造函数;任何函数,如果不通过new操作符来调用,那它与普通函数并无区别。

(1)当做构造函数调用

1 var person = new Person("CC",23);

 

(2)当做普通函数使用

1 Person("CC",23);    //添加到window对象
2 console.log(window.name);    //"CC"
3 console.log(window.age);    //23

 

(3)在另一个对象的作用域中调用

1 var person = new Object();
2 Person.call(person,"CC",23);
3 console.log(person.name);    //"CC"
4 console.log(person.age);    //23

 

构造函数的问题

使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一次。

1 var person1 = new Person("CC",23);
2 var person2 = new Person("VV",32);

两个实例都有sayName()方法,但是两个方法不是同一Function的实例,也就是说,两个实例上的同名函数是不相等的。

1 console.log(person1.sayName == person2.sayName);    //false

 

下篇 JS 对象(5)—原型模式 链接在此!!!

posted @ 2016-07-28 00:27  Aaron_Xiao  阅读(731)  评论(0)    收藏  举报