JAVASCRIPT:"this"关键字在下面的Prototype模式中指的是什么(Phaser框架)
JAVASCRIPT: what does "this" keyword refer to in the Prototype pattern below (Phaser framework)
//HTML code
<!doctype html>
<head>
<script src="phaser.min.js"></script>
<script src="src/boot.js"></script>
<style>body{margin:0}</style>
<script>
var letsgo = function() {
var game = new Phaser.Game(320, 480, Phaser.CANVAS, "game");
game.state.add("Boot",boot);
game.state.start("Boot");
};
letsgo();
</script></head><body></body>
</html>
******boot.js*****
var boot = function(game){};
boot.prototype = { //prototype pattern
preload: function(){
this.game.load.image("loading","assets/loading.png");
},
create: function(){ // this code is not important
this.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL;
this.scale.pageAlignHorizontally = true;
this.scale.setScreenSize();
}
}
this
在this.game.load.image("loading","assets/loading.png");
中指的是什么?没有原型它指的是 boot
对象。但是对于原型模式,它采用不同的对象值。我试图找出那个对象的价值是什么。有什么想法吗?
这是一个伪经典实例化模式。 (你可以分辨出来,因为它使用了 this 和 .prototype。)所以 "this" 指的是它的实例。
This 是关于该主题的非常好的博客。
简而言之,伪经典实例化是通过放置一个new
关键字来完成的。您以前可能见过这样的东西:var instance = new Constructor(params);
?
new 关键字的作用是在运行时将两行代码添加到任何已经存在的代码中。即,
var Person = function(name, age) {
// new keyword adds this line:
// this = Object.create(Person.prototype);
this.name = name;
this.age = age;
// it also adds this line:
// return this;
}
在此模式中与属性分开的函数,因为它们不会随着实例的不同而改变。所以在这种情况下(并反映你的例子)我们将有:
Person.prototype.greet = function() {
console.log(this.name);
};
// .... more functions here.
或者,如您的示例所示,他们通过这样做完全覆盖了原型对象:
Person.prototype = {
greet : function() {
console.log(this.name);
},
...
}
所以,简而言之
"this" 将引用创建的任何实例。
var bob = new Person("Bob", 40);
对于 bob,this 指的是具有属性 name = "Bob", age = 40.
的对象
我们可以创建多个实例:
var sally = new Person("Sally", 34);
现在对于 sally,"this" 指向具有属性 name = "Sally", age = 34.
的对象
这两者可以共存,我们不必担心它们以后如何使用,因为 "this" 会跟踪给定的实例。
代码段中的标记 "this" 将引用使用 "new" 关键字针对构造函数 "boot" 创建的任何对象。
例如,如果脚本中的其他地方有这样一行:
var myBoot = new boot(someGame);
myBoot 将指向 "this" 所指的内容。
//HTML code
<!doctype html>
<head>
<script src="phaser.min.js"></script>
<script src="src/boot.js"></script>
<style>body{margin:0}</style>
<script>
var letsgo = function() {
var game = new Phaser.Game(320, 480, Phaser.CANVAS, "game");
game.state.add("Boot",boot);
game.state.start("Boot");
};
letsgo();
</script></head><body></body>
</html>
******boot.js*****
var boot = function(game){};
boot.prototype = { //prototype pattern
preload: function(){
this.game.load.image("loading","assets/loading.png");
},
create: function(){ // this code is not important
this.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL;
this.scale.pageAlignHorizontally = true;
this.scale.setScreenSize();
}
}
this
在this.game.load.image("loading","assets/loading.png");
中指的是什么?没有原型它指的是 boot
对象。但是对于原型模式,它采用不同的对象值。我试图找出那个对象的价值是什么。有什么想法吗?
这是一个伪经典实例化模式。 (你可以分辨出来,因为它使用了 this 和 .prototype。)所以 "this" 指的是它的实例。
This 是关于该主题的非常好的博客。
简而言之,伪经典实例化是通过放置一个new
关键字来完成的。您以前可能见过这样的东西:var instance = new Constructor(params);
?
new 关键字的作用是在运行时将两行代码添加到任何已经存在的代码中。即,
var Person = function(name, age) {
// new keyword adds this line:
// this = Object.create(Person.prototype);
this.name = name;
this.age = age;
// it also adds this line:
// return this;
}
在此模式中与属性分开的函数,因为它们不会随着实例的不同而改变。所以在这种情况下(并反映你的例子)我们将有:
Person.prototype.greet = function() {
console.log(this.name);
};
// .... more functions here.
或者,如您的示例所示,他们通过这样做完全覆盖了原型对象:
Person.prototype = {
greet : function() {
console.log(this.name);
},
...
}
所以,简而言之
"this" 将引用创建的任何实例。
var bob = new Person("Bob", 40);
对于 bob,this 指的是具有属性 name = "Bob", age = 40.
我们可以创建多个实例:
var sally = new Person("Sally", 34);
现在对于 sally,"this" 指向具有属性 name = "Sally", age = 34.
这两者可以共存,我们不必担心它们以后如何使用,因为 "this" 会跟踪给定的实例。
代码段中的标记 "this" 将引用使用 "new" 关键字针对构造函数 "boot" 创建的任何对象。
例如,如果脚本中的其他地方有这样一行:
var myBoot = new boot(someGame);
myBoot 将指向 "this" 所指的内容。