function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name);
}}
var person1=new Person("Bob",29);
var person2=new Person("Mary",18);
可以观察到:
a.Person方法中没有显示的创建对象;
b.直接将属性名和方法赋给了this对象;
c.没有return语句。
要创建Person新实例,必须使用new操作符。以这种方式调用构造函数会经历以下4个步骤:
a.创建一个新对象;
b.将构造函数作用域赋给新对象(因此this指向这个新对象);
c.执行构造函数的代码(为这个新对象添加属性);
d.返回新对象。
person1和person2中分别保存着person的一个不同实例。这两个对象都有一个constructor(构造函数)属性。该属性指向Person。(有关constructor等原型链的概念,可参见另一篇博文http://blog.youkuaiyun.com/u010267996/article/details/70049493)
alert(person1.constructor==person); //true
alert(person2.constructor==person); //true
---------------------------------------------------------------------------------------------
按照javascript语言精粹中所说,如果在一个函数前面带上new来调用该函数,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将被绑定到那个新对象上。这个话很抽象,我想用实例来让自己加深理解。
1.如果就一个函数,没有返回值,没有prototype成员,然后使用new,会是什么结果呢?
如果一个函数没有返回值,那么如果不使用new来创建变量,那么该变量的值为undefined.
如果用了new,那么就是Object.说明一个函数的默认的Prototype是Object.
function Test1(str) {
this.a = str;
}
var myTest = new Test1("test1");
alert(myTest); //[object Object]
function Test1WithoutNew(str) {
this.a = str;
}
var myTestWithoutNew = Test1WithoutNew("test1");
alert(myTestWithoutNew); //undefined;
2.如果函数有返回值,但是返回值是基本类型。那么new出来的myTest还是object.
因为基本类型的prototype还是Object. 而如果不使用new,那么返回值就是string的值。
function Test1(str) {
this.a = str;
return this.a;
}
var myTest = new Test1("test1");
alert(myTest); //Object
function Test1WithoutNew(str) {
this.a = str;
return this.a;
}
var myTestWithoutNew = Test1WithoutNew("test1");
alert(myTestWithoutNew); //"test1"
3。如果函数的返回值为new出来的对象,那么myTest的值根据new出来的对象的prototype而定。
function Test1(str) {
this.a = str;
return new String(this.a);
}
var myTest = new Test1("test1");
alert(myTest); //String "test1"