我对Java有所了解,但仍在寻找自己的方式。我看到了有关使用Socket.IO的Javascript的教程。我试图跟进,但是对此Javascript构造函数和标头Online代码有点困惑。我以前没有看过这种格式。这等于我在下面编写的代码吗?用var self = {...}方法创建构造函数是否合适?
//Online code
//-------------------------
var Player = function(id){
var self = {
x:250,
y:250,
id:id
}
return self;
}
//Equivalent?
//------------------------
var Player = function(id){
var self = this;
this.x = 250;
this.y = 250;
this.id = id;
}
答案 0 :(得分:2)
如果创建一个构造函数,则可以重新使用它,任何人都可以创建一个实例。 如果创建一个新对象,则只能使用该对象。
var Player = function(id){
var self = this;
this.x = 250;
this.y = 250;
this.id = id;
}
const player = new Player(id)
在这种情况下,属性是对象的一部分,因此,每个Player都会拥有它们
如果返回一个对象,例如:
var Player = function(id){
var self = {
x:250,
y:250,
id:id
}
return self;
}
此值将与调用该方法的人相关联,但实例将是一个空对象。
答案 1 :(得分:1)
两个函数之间的主要区别是它们链接(或不链接)到该函数的prototype
对象的方式。
此方法将返回的对象链接到Player.prototype
:
var Player = function(id) {
// var self = this; <== this doesn't do anything
this.x = 250;
this.y = 250;
this.id = id;
}
let p = new Player('some id')
// linked to player protoype :
console.log(Object.getPrototypeOf(p) === Player.prototype) // true
// which means you get inheritence:
Player.prototype.talk = function() {
console.log(this.id, "talking")
}
p.talk() // sees the talk method on Player
如果在函数中创建一个一次性对象并返回该对象,则该对象不再链接到函数原型。这只是一个从函数返回的常规旧对象:
var Player = function(id){
var self = {
x:250,
y:250,
id:id
}
return self;
}
let p = Player("some id")
console.log(Object.getPrototypeOf(p) === Player.prototype) // false
Player.prototype.talk = function(){console.log("hello")}
// no inheritence
try {
p.talk() // <= that's an error
} catch(err){
console.log("Error:", err)
}
答案 2 :(得分:1)
在您的示例中,两个函数都将使同一个对象掉。所以是的,它们在结果上是等效的。
区别是:
var p1 = Player ("id")
)或使用new
关键字var p2 = new Player ("id")
。 p1
和p2
将是具有相同属性的对象。但是它们不会相等(p1 !== p2
),因为它们是不同的对象。仅可以使用new
关键字var p3 = new Player ("id")
调用第二个函数,而没有new
的调用将返回undefined
创建构造函数的正确方法是使用第二种形式。它被认为是good practice。