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

标签 javascript

下面的示例代码是 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) function User 是否真的在这段代码中调用过?我注意到当它说 assert(user...) 时,user 是小写的。如果函数被调用,如何调用?当它断言变量 user 时它会被调用吗,它附加了一个函数调用,即 User("John,"name)

2) 如果我假设函数 User 从未被调用是正确的,有没有办法运行代码this.name = first + ""+ last;`?

3) 如果函数 User 被调用,或者如果它被调用,你能解释一下函数 User 内部的操作顺序吗?例如,它在执行之前返回新用户 this.name = first + ""+ last; 如果此函数被调用或被调用,那将如何工作?

4) !(this instanceof User) 如果为真,会以何种方式。由于函数 User 是对象,“this”不会总是它自己的一个实例吗?

5) 关于第一个断言,即 assert(user, "this was defined correctly, even if it was by mistake"),你能解释一下它是如何被正确定义的吗,重要的是,请解释这是怎么个错误?应该怎么做才不会出错?

6) 关于第二个断言,为什么保持正确的名称是值得注意的?是不是变量name已经赋值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 的情况下调用旨在用作构造函数的函数。运算符可能导致全局对象的意外修改。

  1. User在此行调用:var user = User("John", name); .小写 user持有对新大写字母 User 的引用实例。

  2. 参见 #1。

  3. 如果 User在没有 new 的情况下调用, 然后 this不会是 instanceof User .发生这种情况时,我们立即调用 new User(...) .在第二次调用中,this 将是 instanceof User ,所以条件 block 被跳过,我们只是继续构造函数,创建一个新的 User 实例。正如最初预期的那样。

  4. 当调用时没有 new运算符,this 的值在函数中简单地引用全局对象,即 window在浏览器中。这是 JavaScript 设计中的一个严重错误,本练习将演示解决方法。

  5. 因为 User 没有显式返回构造函数(没有 instanceof 检查 block ),如果 User在没有 new 的情况下被调用它会返回 undefinedassert会失败。 instanceof检查可防止这种情况。

  6. 没有instanceof的保护检查,打电话User没有new会导致意想不到的结果。自 this会引用 window , 分配给 this.name会更新 window.name , 而不是 name新属性User实例,以及 assert会失败。

关于javascript - 使用新的运算符——来自 John Resig #36,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5346951/

相关文章:

javascript - 我如何在 XPages 中安装 jquery 和 jqueryUI 文件?

javascript - 存档跨浏览器、跨平台 css/js 错误的网站?

javascript - 无法使用 ReactJS 在输入字段中输入文本值

javascript - 使用 24 小时格式的小时列表填充数组

javascript - Python3/JS - 如何使用 eel 处理本地文件上传?

javascript - JS中的 ">>>"运算符是什么?

javascript - 我可以使用 post 单击 JQuery 页面上的按钮吗?

javascript - HTML 错误。标签未关闭

javascript - Jasmine - 如何模拟 history.pushState 和假事件发射?

javascript - jQuery remove() 或 after() 导致空格被删除