作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试开始使用 Javascript 中的类 ( thanks to this guide )。我已经学会了如何创建类的实例以及如何嵌套它们,但我不知道如何使子类与其父类进行通信。
这是我的基本示例:我有一个 Board 类,它有一个数组 allPieces
,其中包含 20 个 Piece
子对象。
function Board(){
this.allPieces = [];
this.selectedPiece = null;
for(var i = 0; i < 20; i++){
this.allPieces.push(new Piece(i));
}
}
Board.prototype.makeSelection = function(currentPiece){
this.selectedPiece = currentPiece;
}
function Piece(index){
this.type = index;
this.jqObject = $(".piece").eq(this.type);
this.jqObject.click(function(){
this.pieceClicked();
}.bind(this));
}
Piece.prototype.pieceClicked = function(){
Board.makeSelection(this); // <------ This gives me an error!
// How do I tell Board that a selection has been made?
}
new Board();
我可以通过调用 this.allPieces[0].anyMethod()
从 Board 与 Piece 进行通信。但是,我不知道单击后如何从 Piece 与其父 Board 进行通信;我收到错误“Board.makeSelection 不是函数”。我如何告诉董事会某件作品已被选中?
我尝试为 Board 分配一个 var name var game = new Board();
然后调用 game.makeSelection(this);
但问题是这一次只允许有一个 Board 实例。我需要有多个实例。有什么建议吗?
最佳答案
为了实现这一点,您需要在各个片段上建立某种双向数据绑定(bind)。您可以通过执行以下操作来实现此目的。
首先,修改piece类,以便它知道它的父级:
function Piece(index, parent){ // notice the second argument
this.parent = parent; // we're going to store a reference to the parent here
this.type = index;
this.jqObject = $(".piece").eq(this.type);
this.jqObject.click(function(){
this.pieceClicked();
}.bind(this));
}
Piece.prototype.pieceClicked = function(){
this.parent.makeSelection(this); // we'll access the makeSelection method from the parent
}
然后,修改棋盘类,使其将自身作为第二个参数传递到棋子的创建中:
function Board(){
this.allPieces = [];
this.selectedPiece = null;
for(var i = 0; i < 20; i++){
this.allPieces.push(new Piece(i, this));
// we'll invoke the piece with a second argument which will be the parent (the board)
}
}
这将允许每个片段通过访问片段上的 this.parent 属性来了解其父片段。然后,您可以通过访问 this.parent.makeSelection 并将其作为参数传递来访问父级上的 make 选择方法。
关于Javascript:如何在不同类之间进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27535520/
我是一名优秀的程序员,十分优秀!