将一个函数原型化为另一个 JavaScript 函数?

问题描述 投票:0回答:4

我在 OA 上被问到以下问题。我没弄清楚,我想知道这个问题的解决方案。

我被要求安慰

Thank you for Logging in Dan
:

var Wrap = (function(){
  function User(name){
    this.name = name;
  }
  var d = function(){
    console.log('1');
    return "Thank you for Logging in" + this.name;
  };
  User.prototype.thankForLoggingln = d;
  return User;
})();

我发现

Wrap
返回 User,这使得
Wrap
等于
User
。如果我这样做
Wrap('Dan')
this.name
将更改为
Dan

问题是,我无法访问

thankForLoggingln
。我尝试过
Wrap.()thankForLoggingln()
之类的事情,但出现了参考错误。有什么想法吗?

javascript node.js prototype
4个回答
1
投票

您对

的理解

我发现 Wrap 返回 User,这使得 Wrap 等于 用户

是正确的。但是当你说

Wrap('Dan')
时,在这种情况下
this
将指的是 Global 对象。如果您在浏览器上运行它,那么您可以通过
window.name
访问您的名称变量。您必须使用
new
关键字调用该函数,以便创建一个新对象,并且
this
将引用新创建的对象,而
User
将是它的构造函数。在这种情况下,它将可以访问
thankForLoggingln
函数。

所以正确的做法是

var user = new Wrap('Dan');
user.thankForLoggingln();

欲了解更多信息,请阅读构造函数你不懂JS


1
投票
User.prototype.thankForLoggingln = d;

意味着使用 User 作为构造函数创建的用户对象继承`thankForLogging in。

那么

console.log( new Wrap(" Dan").thankForLoggingln());

就可以了。紧接着它之前应该有一个值为“1”的 console.log。

设置了两个额外的陷阱:

  • thankForLogginln
    以小写 L 结尾,后跟“n”。将其拼写为“thankForLogginIn”需要调试。
  • 名称必须带有前导空格才能正确打印。

0
投票

您可以通过实例化 Wrap 来创建 User 的实例,如下所示:

var user = new Wrap('Dan');

有了该实例,您就可以像这样调用 thankYouForLoggingIn 方法:

var message = user.thankYouForLoggingIn();
console.log(message);

所以你的代码示例实际上只是创建类的一种奇特方式。


0
投票

尝试以下一定会成功。

Wrap.prototype.thankForLoggingln() 

该函数立即被调用,在尝试 Wrap 后它给了我这个输出。所以

ƒ User(name){
    this.name = name;
  }

基本上它遵循使用原型的干净继承。因此 Wrap.prototype 提供了方法和构造函数用户。要么使用 new 关键字访问,要么使用原型访问。 检查以下内容:

关于原型

© www.soinside.com 2019 - 2024. All rights reserved.