ECMAScript中的构造函数可用来创建特定类型的对象。像Object和Array这样的原生构造函数,在运行时会自动出现在执行环境中。此外,也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。例如,可以使用构造函数模式将前面的例子重写如下:
function Person(name,age,Job){
this.name=name;
this.age=age;
this.Job=Job;
this.sayName=function(){
alert(this.name);
};
}
var personl:new Person("Nicholas",29,"Software Engineer");
var person2=new Person("Greg",27,"Doctor");
personl.sayName(); //"Nicholas"
person2.sayName(); //"Greg"
在这个例子中,Person()函数取代了createPerson()函数。我们注意到,Person()中的代码除了与createPerson()中相同的部分外,还存在以下不同之处:
□没有显式地创建对象;
□直接将属性和方法赋给了this对象;
□没有return语句。
此外,还应该注意到函数名Person使用的是大写字母P,按照惯例,构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。这个做法借鉴自其他OO语言,主要是 为了区别于ECMAScript中的其他函数;因为构造函数本身也是函数,只不过可以用来创建对象而已。
要创建Person的新实例,必须使用new操作符。以这种方式调用构造函数实际上会经历以下4个步骤:
(1)创建一个新对象;
(2)将构造函数的作用域赋给新对象(因此this就指向了这个新对象);
(3)执行构造函数中的代码(为这个新对象添加属性);
(4)返回新对象。
备注:南昌网站设计公司技术认为,构造类似于类的结构,但有些不用.
在前面例子的最后,personl和person2分别保存着Person的一个不同的实例。这两个对象都有一个constructor(构造函数)属性,该属性指向Person,如下所示:
alert(personl.constructor==Person); //true
alert(person2.constructor==Person); //true
对象的constructor属性最初是用来标识对象类型的。但是,提到检测对象类型,还是instanceof操作符要更可靠一些。我们在这个例子中创建的所有对象既是Object的实例,同时也是Person的实例,这一点通过instanceof操作符可以得到验证:
alert(personl instanceof Object); //true
alert(personl instanceof Person); //true
alert(person2 instanceof Object); //true
alert(person2 instanceof Person); //true
创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型;而这正是构造函数模式胜过工厂模式的地方。在这个例子中,personl和person2之所以同时是Object的实例,是因为所有对象均继承自Object。
南昌网络公司技术员提示,以这种方式定义的构造函数是定义在Global对象(在浏览器中是window对象)中的,因此除非另有说明,instanceof操作符和constructor属性始终会假设是在全局作用域中查询构造函数.
本文仅限内部技术人员学习交流,不得作于其他商业用途. 文章出自:南昌网站建设公司-百恒网络 http://www.jxbh.cn 如转载请注明出处!