JavaScript对象构造函数

时间:2019-05-05 01:37:02

标签: javascript socket.io

我对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;
}

3 个答案:

答案 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)

在您的示例中,两个函数都将使同一个对象掉。所以是的,它们在结果上是等效的。

区别是:

  1. 可以调用第一个函数本身(var p1 = Player ("id"))或使用new关键字var p2 = new Player ("id")p1p2将是具有相同属性的对象。但是它们不会相等p1 !== p2),因为它们是不同的对象。

仅可以使用new关键字var p3 = new Player ("id")调用第二个函数,而没有new的调用将返回undefined

  1. 第一个功能不能使用prototype based inheritance。第二罐。

创建构造函数的正确方法是使用第二种形式。它被认为是good practice