我在 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()
之类的事情,但出现了参考错误。有什么想法吗?
您对
的理解我发现 Wrap 返回 User,这使得 Wrap 等于 用户
是正确的。但是当你说
Wrap('Dan')
时,在这种情况下 this
将指的是 Global 对象。如果您在浏览器上运行它,那么您可以通过 window.name
访问您的名称变量。您必须使用 new
关键字调用该函数,以便创建一个新对象,并且 this
将引用新创建的对象,而 User
将是它的构造函数。在这种情况下,它将可以访问 thankForLoggingln
函数。
所以正确的做法是
var user = new Wrap('Dan');
user.thankForLoggingln();
User.prototype.thankForLoggingln = d;
意味着使用 User 作为构造函数创建的用户对象继承`thankForLogging in。
那么
console.log( new Wrap(" Dan").thankForLoggingln());
就可以了。紧接着它之前应该有一个值为“1”的 console.log。
设置了两个额外的陷阱:
thankForLogginln
以小写 L 结尾,后跟“n”。将其拼写为“thankForLogginIn”需要调试。您可以通过实例化 Wrap 来创建 User 的实例,如下所示:
var user = new Wrap('Dan');
有了该实例,您就可以像这样调用 thankYouForLoggingIn 方法:
var message = user.thankYouForLoggingIn();
console.log(message);
所以你的代码示例实际上只是创建类的一种奇特方式。
尝试以下一定会成功。
Wrap.prototype.thankForLoggingln()
该函数立即被调用,在尝试 Wrap 后它给了我这个输出。所以
ƒ User(name){ this.name = name; }
基本上它遵循使用原型的干净继承。因此 Wrap.prototype 提供了方法和构造函数用户。要么使用 new 关键字访问,要么使用原型访问。 检查以下内容: