JavaScript构造函数浅谈

构造函数
JavaScript 中的构造函数和其它语言中的构造函数是不同的。
通过 new 关键字方式调用的函数都被认为是构造函数。
在构造函数内部 - 也就是被调用的函数内 - this 指向新创建的对象 Object。
这个新创建的对象的 prototype 被指向到构造函数的 prototype。
如果被调用的函数没有显式的 return 表达式,则隐式的会返回 this 对象 - 也就是新创建的对象。
function Foo() {
    this.bla = 1;
}
Foo.prototype.test = function() {
    console.log(this.bla);
};
var test = new Foo();
上面代码把 Foo 作为构造函数调用,并设置新创建对象的 prototype 为 Foo.prototype。
显式的 return 表达式将会影响返回结果,但仅限于返回的是一个对象。
function Bar() {
    return 2;
}
new Bar(); // 返回新创建的对象

function Test() {
    this.value = 2;

    return {
        foo: 1
    };
}
new Test(); // 返回的对象
new Bar() 返回的是新创建的对象,而不是数字的字面值 2。
因此 new Bar().constructor === Bar,但是如果返回的是数字对象,结果就不同了,如下所示
function Bar() {
    return new Number(2);
}
new Bar().constructor === Number
这里得到的 new Test()是函数返回的对象,而不是通过new关键字新创建的对象,因此:
(new Test()).value === undefined
(new Test()).foo === 1
如果 new 被遗漏了,则函数不会返回新创建的对象。
function Foo() {
    this.bla = 1; // 获取设置全局参数
}
Foo(); // undefined
虽然上例在有些情况下也能正常运行,但是由于 JavaScript 中 this 的工作原理,
这里的 this 指向全局对象。
工厂模式
为了不使用 new 关键字,构造函数必须显式的返回一个值。

function Bar() {
    var value = 1;
    return {
        method: function() {
            return value;
        }
    }
}
Bar.prototype = {
    foo: function() {}
};
new Bar();
Bar();
上面两种对 Bar 函数的调用返回的值完全相同,一个新创建的拥有 method 属性的对象被返回,
其实这里创建了一个闭包。
还需要注意, new Bar() 并不会改变返回对象的原型(译者注:也就是返回对象的原型不会指向 Bar.prototype)。
因为构造函数的原型会被指向到刚刚创建的新对象,而这里的 Bar 没有把这个新对象返回(译者注:而是返回了一个包含 method 属性的自定义对象)。
在上面的例子中,使用或者不使用 new 关键字没有功能性的区别。
上面两种方式创建的对象不能访问 Bar 原型链上的属性,如下所示:
var bar1 = new Bar();
typeof(bar1.method); // "function"
typeof(bar1.foo); // "undefined"
var bar2 = Bar();
typeof(bar2.method); // "function"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值