我想调用子对象方法表单原型对象:
function Hamster() {
this.sleep = function(){
console.log('sleep');
}
}
Hamster.prototype = new function(){
var _self = this;
this.test = function(){
this.sleep();
//_self.sleep(); //not working
}
}
lazy = new Hamster();
lazy.test();
为什么当我使用this.sleep()
时一切正常,但当我使用_self.sleep()
(_self
变量有this
值)时,我会收到错误消息?为什么_self
函数中的this
和test()
不相同?
答案 0 :(得分:1)
this
中存储的self
引用与您在分配给this
的匿名函数中调用的test()
引用不同。关键是您正在创建和分配给this
的函数的Hamster.prototype
范围是一个空对象。这是因为您使用了new
关键字。
Hamster.prototype = new function(){
//Stores the reference to the empty object that's the scope of the anonymous
//function because it was called using the new keyword.
var _self = this;
this.test = function(){
//Works because the this keyword is a reference to Hamster.
this.sleep();
//Does not work because the empty object doesn't have a sleep method.
//_self.sleep();
}
}
答案 1 :(得分:1)
你对原型的运作方式感到困惑。
你可能只想要
Hamster.prototype = {
test: function() {
this.sleep();
}
};
您正在做的是为原型创建一个新对象。您设置的_self
变量不是指向单个Hamster对象的this
,而是指向您正在创建的新原型对象的this
,这对于世界而言是丢失的。
答案 2 :(得分:1)
让我们用一个返回两个东西的函数来编写它,让我们更容易地比较它们
function Constructor() {}
Constructor.prototype = new function () {
var foo = this;
this.bar = function () {
return {"this": this, "foo": foo};
};
};
var instance = new Constructor(),
o = instance.bar();
现在测试一下我们有什么
o.this === instance; // true
o.foo === instance; // fase
// so what is o.foo ?
o.foo === Constructor.prototype; // true
这告诉我们什么?
instance
调用方法时,this
引用该实例new
调用函数时,this
引用由new
创建的新对象实例;在这种情况下,我们将对象设置为Constructor
这些参考文献何时设定?
this
中的instance.bar
仅在实际调用instance.bar
时设置this
中的new function () { ... }
会在创建后立即设置,并且在此之后不会更改(您基本上使用了 IIFE ),它是还有new
返回的内容,以及Constructor.prototype
在此示例中设置的内容答案 3 :(得分:0)
_self是你定义的匿名函数之外的局部变量,你没有通过它所以它没有在里面定义