再说Js构造函数

function Rectangle(w,h)
{
    this.width = w;
    this.height = h;
    
    return "mzwu.com";
}

上边构造函数和我们常见的构造函数稍有不同:有返回值,这对我们实例化对象有影响吗?测试一下:

var rectangle = new Rectangle(100,120);
alert(rectangle.width);

结果完全正常[1],再做个测试:

alert(Rectangle(100,120));

结果显示"mzwu.com",这就和调用普通函数没区别了。

可以这么理解:当普通函数使用new关键字来实例化时,会有一个this对象被传进函数中,函数内可对这个对象进行处理,此时普通函数也称为构造函数。[2]

构造函数稍做修改:

function Rectangle(w,h)
{
    this.width = w;
    this.height = h;
    
    return this.width;
}

alert(Rectangle(100,120));

等效于:

function Rectangle(w,h)
{
    this.width = w;
    this.height = h;
}
Rectangle(100,120);
alert(width);

当函数作普通函数使用时,里边的this指的是window对象,当作构造函数用时,表示的是构造函数对象。

原型对象是构造函数特有的吗?

测试一下:

function Add(a,b)
{
    return a+b;
}

alert(!!Add.prototype);

结果:true,这说明任何函数都有原型对象,并非构造函数才有。



[1].《JavaScript权威指南》五版(P157)中说明:构造函数通常没有返回值。它们初始化作为this的值来传递的对象,并且没有返回值。然而,一个构造函数是允许返回一个对象值的,并且,如果它这么做,返回的对象成为new表达式的值。在此情况下,作为this的值的对象会被抛弃。

function Rectangle(w,h)
{
    this.width = w;
    this.height = h;
    
    return {url:"mzwu.com"};
}
var rectangle = new Rectangle(100,120);
alert(rectangle.width);
alert(rectangle.url);

结果:

引用内容 引用内容
undefined
mzwu.com

[2].《JavaScript权威指南》五版(P156)中对构造函数说明:new运算符的后面必须跟着一个函数调用。new创建了一个新的没有任何属性的对象,然后调用该函数,把新的对象作为this关键字的值传递。设计来和new运算符一起使用的函数叫做构造函数。

评论: 0 | 引用: 0 | 查看次数: 10559
发表评论
登录后再发表评论!