原生的构造函数,运行时会自动出现在执行环境中。也可以创建自定义的构造函数,自定义对象类型的属性和方法
function Person(name,age){
this.name = name;
this.age = age;
this.sayName = function (){
alert(this.name);
}
}
//当new去调用一个函数,函数中的this就是创建出来的对象,而且函数的返回值直接就是this(隐式返回),所以不用写return也可以
var person1 = new Person("Nicholas",29);
var person2 = new Person("psx",18);
person1.sayName()
调用构造函数会经历以下四个步骤:
(1)创建一个新对象;
(2)直接将属性和方法赋给this对象(因此this就指向了这个新对象)
(3) 执行构造函数中的代码(为这个新对象添加属性)
(4)返回新对象
person1和person2分别保存着Person的一个不同的实例,这两个对象都有一个constructor(构造函数)属性,该属性指向Person
person1.constructor = Person
创建自定义构造函数意味着将来可以将它的实例标识为一种特定的类型
构造函数的问题:
构造函数的主要问题:就是每个方法都要在每个实例上重新创建一遍,前面例子中,person1和person2都有一个名为sayName()的方法,但那两个方法不是同一个Function的实例。因此没定义
一个函数,也就是实例化了一个对象。
可以这样理解:
this.sayName = new Function("alert(this.name)");//与声明函数在逻辑上是等价的
不同实例上的同名函数是不相等的
创建两个完成同样任务的Function实例的确没有必要
构造函数中的this