javascript – 使用新的运算符 – 来自John Resig#36

前端之家收集整理的这篇文章主要介绍了javascript – 使用新的运算符 – 来自John Resig#36前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
下面的示例代码是John Resig的Learning Advnaced JavaScript中的#36. http://ejohn.org/apps/learn/#36

It is called We need to make sure the
new operator is always used.

六个问题 – 我希望尽可能多地提供详细信息

1)函数User是否曾在此代码中实际调用过?我注意到当它说assert(用户…)时,用户是小写的.如果函数调用,怎么样?当它断言变量user时会调用它,该变量user附加了一个函数调用,即User(“John,”name)

2)如果Im在假设函数User从未被调用时是正确的,那么有没有一种方法可以运行codethis.name = first“”last;`?

3)如果调用函数User,或者如果要调用它,可以解释函数User内的操作顺序.例如,它在执行this.name = first“”last之前返回新用户;如果调用调用函数,它将如何工作?

4)以什么方式可以!(这个用户实例)如果是真的.由于函数User是对象,不会“这个”总是它自己的一个实例吗?

5)关于第一个断言,即断言(用户,“这是正确定义的,即使它是错误的”),你能否解释一下它是如何被正确定义的,重要的是,请解释它是如何错误的?它应该如何完成所以它不是一个错误

6)关于第二个断言,为什么保持正确的名称是值得注意的?它不像变量名称一样简单,已经被赋予了.Resig`.您可能以何种方式改变名称

function User(first,last){ 
  if ( !(this instanceof User) ) 
    return new User(first,last); 

  this.name = first + " " + last; 
} 

var name = "Resig"; 
var user = User("John",name); 

assert( user,"This was defined correctly,even if it was by mistake." ); 
assert( name == "Resig","The right name was maintained." );

解决方法

这个例子展示了JavaScript设计中的一个基本缺陷,即调用函数用作没有new运算符的构造函数会导致无意中修改全局对象.

>在此行上调用用户:var user = User(“John”,name);.小写用户拥有对新的大写User实例的引用.>见#1.>如果在没有new的情况下调用User,那么这将不是User的实例.发生这种情况时,我们会立即呼叫新用户(…).在第二次调用中,这将是User的一个实例,因此跳过条件块,我们继续使用构造函数,创建一个新的User实例.>在没有new运算符的情况下调用它时,函数中的this值仅指向全局对象,即浏览器中的窗口.这是JavaScript设计中的一个严重错误,本练习演示了一种解决方法.>因为没有来自User构造函数的explict返回(没有instanceof check的块),如果在没有new的情况下调用User,它将返回undefined,并且assert将失败. instanceof检查阻止了这一点.>如果没有对instanceof检查的保护,则在没有new的情况下调用User会导致意外结果.由于这将引用window,对this.name的赋值将更新window.name,而不是新User实例的name属性,并且assert将失败.

猜你在找的JavaScript相关文章