源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Javascript中构造函数要注意的一些坑

  • 时间:2021-01-30 00:29 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Javascript中构造函数要注意的一些坑
[b]前言[/b] 最近在家看书:《你不知道的Javascript》,看到构造函数调用时会绑定this,就顺便打开控制台输了一些代码,详细测试了一下。 构造函数简单的讲,即定义出来专供new 式调用的函数。 [b]如:[/b]
function A(b) {
 this.b = b || 'bbb';
}
然后你就可以通过new ,来构建一个 A 的实例:
var a = new A('B')
但是,一个首要的坑是,构造函数与一个普通函数并无不同,如果你故意不使用new,或忘记用new,都会得到奇怪的错误:
var aa = A('adadada');
[b]这样调用,并不会显式地报错,但实际上隐患深埋:[/b] [list=1] [*]aa并不是A的实例,而变成了 undefined[/*] [*]多了一个名为 b 的全局变量,值是 ‘adadada' [/*] [/list] [b]这就是无new 调用构造函数的坑。[/b] 下面说其他的: [b]构造函数自身有返回值[/b] 比如:
function A(b) {
 this.b = b || 'bbb';
 return {b: '0000'};
}
这个时候,无论是否使用new来调用A,得到的结果都会相同,即得到一个普通对象[code]:{b:'0000′}[/code] 当然,此时是否带 new 调用,还是有一个不同点的,即:不带new时,依然会莫名声明一个 叫 b 的全局变量。 既然,构造函数有显式返回值时,会代替默认应该返回的this,成为返回值,那么,是不是所有返回值都能覆盖this呢? [b]测试显式返回值[/b] 众所周知,函数都是有返回值的,只是如果没有 return,则会返回undefined. 那么,我就在构造函数里显式返回一个undefined,会怎么样?
var a = function (){this.b = 'b'; return undefined};
new a(); // {b:'b'}
显式返回一个 undefined ,并不能阻止构造函数式调用的默认行为。 [b]下图是更多测试:[/b] [img]http://files.jb51.net/file_images/article/201701/201712395249436.jpg?201702395317[/img] 简单的总结: 显式的返回以下值:undefined, null, boolean, number等基础类型,并不会代替 new 式调用的默认行为。 但显式返回以下值:{},[],RegExp, Date, Function,均会代替 new 调用的默认返回值 this. 大家都看到了,后者,全都是 对象,是复杂类型。 [b]随手一记[/b] 前面说过,本该进行 new 式调用的构造函数,被当作普通函数调用,那么,如果函数体中,有[code] this.x = xxx [/code]这样的赋值语句,则会被赋值给全局对象(即 windows),从而变成一个全局变量。 原因相信大家都知道,而本书中也专门讲过:函数调用时,默认的this就是绑定至全局对象。 而本书还提到:如果函数体是严格模式,则不会绑定 this 至全局对象,如:
var a = function (){'use strict';this.b = 'b'; return /111/g};
a(); // 直接报错
因为严格模式下,默认的 this 指向 undefined 所以说,有两点要提一下: [list=1] [*]严格模式真不错[/*] [*]如果你想声明一个构造函数,那么严格模式是非常必要的 [/*] [/list] [b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部