2017-05-24 32 views
0

我在javascript中的星球“类”。当用户点击html5画布时,会调用合适的星球的manageClick函数,它应该改变某个div的内容。内容应该变成一个按钮。如果用户点击它,那么应该调用星球的函数createShip。非字面参考自我

现在的问题是如何传递到行星本身的参考?我试图创建一个新的函数,在任何对象上调用createShip(),然后用参数'this'调用它。但它似乎并不奏效。什么是正确的方法来做到这一点?

Planet.prototype.createShip =function() {...} 

Planet.prototype.manageClick=function() { 
    $(".dropdown").html("<button onclick=\"buyship(this)\">Buy a ship</button>"); 
} 

function buyship(obj) { 
    obj.createShip(); 
} 
+0

它不应该是'this.buyship()'? –

+1

请注意您的大小写。 '... prototype.CreateShip'不匹配'obj.createShip()'。另外,在命名要直接调用的方法或函数时,请使用camel case('createShip')。对要被称为构造函数(即var obj = new CreateShip()')的函数使用pascal case('CreateShip','ManageClick')。 –

回答

2

请勿使用onclick。而是使用jquery创建按钮并将函数绑定到click事件。使用函数的.bind方法,可以明确地将this值绑定到该函数,而不是将其作为参数传递。

Planet.prototype.createShip =function() {...} 

Planet.prototype.ManageClick=function() { 
    var self = this; 
    var buyShip = $("<button id='buyShip'>Buy a ship</button>").click(buyship.bind(self)) 
    $(".dropdown").append(buyShip); 
} 

function buyship() { 
    this.createShip(); 
} 

小提琴:https://jsfiddle.net/brko5jr7/1/

+1

使用''''或'“”' – slebetman

0

我讨厌使用this因为如果你连你的任何对象的方法来的东西像jQuery的事件处理程序,this可如果你没有代码的事情成为后一个真正的痛苦正好。

我不使用prototype方法为像你一样的编码类,但更愿意把它们写为函数声明。

var Planet = function(){ 
    var ref = this; 
    ref.CreateShip = function() { 
     ref.xyz = 123456; 
    }; 

    ref.ManageClick = function(){ 
     ref.someproperty = "something"; 
    } 
} 

你会发现,马上蝙蝠,我宣布变量ref它指向范围对象,然后我用ref成员,而不是this内。在我看来,它使得可读性更好。因人而异。

实例化仍然是相同的:

变种实例=新行星();

+2

但是,不使用'prototypes'有一个问题。在构造函数中声明方法意味着将为构造对象创建一个新方法(内存值),而'prototype'上的方法保持静态(即实例间共享)。如果构建很多东西或者有大量的构造函数方法,这会导致内存/性能相当暗淡的问题。 – joh04667

+0

好点!谢谢。 –

+0

我仍然会在构造函数中创建'ref'成员,无论如何,使对象引用更不明确。 –