若不使用new 函数名 方式调用函数,则就是普通的函数调用;若函数中没有返回值,则普通的函数调用将毫无意义;
简要事例如下:
var person = new Person(); // person的值为一个对象
但是:
var person = Person (); // 若Person函数无返回值,则person的值为undefined
具体事例如下:
函数没有用return返回信息
【事例一】
function Person (name, age) {
this.name = name;
this.age = age;
this.sayName = function () {
this.alert(this.name);
}
}
// 此时为构造函数,产生的person对象是由解析器产生的
var person = new Person(lily, 22);
var person1 = Person(lucy, 24);
person.sayName(); // 此时会弹出弹框lily
person1.sayName(); // person1的值为undefined(因为函数本身没有return语句),故此时将会报错
此时的sayName是由window调用的;
修改如下:
window.sayName(); // lucy
sayName可用window调用的原因:当Person(lucy, 24)执行时,该方法的对象变成了window。this指向了
window;故可以用window对象调用该方法
函数用return返回了信息:
如果函数返回的是基本数据类型(Number、string,Boolean等)时,new函数将返回一个该函数的实例对象;
而如果函数返回一个引用类型(Object, array, function)时,new函数与直接嗲用函数产生的结果相同
事例二:(返回基本数据类型)
function Test () {
this.name = 'test'
return 'test'
}
var test = new Test(); //test为object对象,该对象包含一个name属性和返回了一个test
var test1 = Test(); //Test()属于一个fuction对象,它只返回了一个字符串test,故test1为
test字符串
事例三:(返回引用数据类型)
function Person(name,age)
{
var o = new Object();
o.name = name;
o.age = age;
o.getName = function()
{
alert(this.name);
}
return o;
}
var obj1 = new Person("liwen",25);
var obj2 = Person("liwen1",25);
obj1.getName(); //liwen*/ new一个函数的实例对象
obj2.getName(); //liwen1*/ 直接调用
//这里new一个函数的对象和直接调用函数产生的结果相同
总结:
构造函数不需要显示返回值。
使用new创建对象(调用构造函数)时,若return的是基本数据类型回忽略返回值;
若return 的是对象,则返回该对象;
javascript中new对象的过程:
如: var myObj = newPerson(“aty”,25);
1.创建一个空的Object对象.var myObj = new Object();
2.将构造函数Person中this指向刚创建的myObj对象
3.将创建的myObj的__proto__指向构造函数Person的prototype。[这一步是建立对象和原型直接的对应关系。firefox下通过
对象的__proto__属性能够访问到原型,IE下则没有暴露出相应的属性。]
4.执行构造函数Person()中的代码