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)—原型模式 链接在此!!!

浙公网安备 33010602011771号