如何在JavaScript中扩展一个类
我正在使用JavaScript构建一个国际象棋游戏。我正在采取面向对象的方法,并且在处理JavaScript的继承时遇到一些困难。我想要成为一个“Piece”抽象类,它包含一些领域和基本的getter/setter,比如这件作品是黑色还是白色。那么我想为每种类型片的类,我可以实例像这样:)如何在JavaScript中扩展一个类
var pieceOne = new Pawn();
典当(应具有的所有字段和计件的方法,但有其自己的运动方法和附加字段(比如它是否已经移动,因为这对大多数作品都没有影响)。这是我目前的一块类:
//This object specifies basic information about pieces.
"use strict";
function Piece(color, type, captured, hasMoved) {
this.color = color;
this.type = type;
this.captured = captured;
this.hasMoved = hasMoved;
this.image = color + "_" + type + ".svg";
}
Piece.prototype.getImage = function getImage(){
return this.image;
}
Piece.prototype.isCaptured = function isCaptured(){
return this.captured;
};
我知道,如果我要做出各种一块我可能会消除“类型”字段中的一个子类,但是我怎么能让一个Pawn子类?像这样?
function Pawn() = new Piece(color, captured, hasMoved);
Pawn.prototype.getLegalMoves = function getLegalMoves(){
//return legal moves
}
var pieceOne = new Pawn("black", false, false);
我相信这只是将特定构件的原型设置为Piece
的实例。例如:
Pawn.prototype = new Piece("", false, false);
然而,这不会调用Piece
(超)构造函数每次实例化一个新的Pawn
时间,所以你必须手动从Pawn
构造函数指定颜色,类型等:
- 编辑 -
你可能会喜欢这个:Javascript inheritance: call super-constructor or use prototype chain?
如果你愿意接受一个OBJ在JS上面向ect的方法我会建议你遵循权力构造函数模式。
基本上你有一个函数为你创建对象并利用闭包来隐藏内部属性(字段或方法)。
function myObject(){
var that={};
var myPrivateField;
var myPrivateFunction=function(){
}
that.myPublicMethod=function(){
}
return that;
}
然后你可以调用方法myObject(),你将得到一个这种类型的新对象。
您可以通过调用另一个对象的电源构造函数来扩展此示例以使用继承,然后使用对象扩充。看看Douglas Crockford的parasatic inheritance的例子。
您可以拨打Piece
的从Pawn
构造和具有该构造操作上Pawn
实例:
function Pawn(/* args... */) {
Piece.call(this, color, type, captured, hasMoved);
/* Pawn-specific constructor code... */
}
扩展一个类可以以不同的方式来完成。最简单的扩展类的方法是使用Object.create方法。这是常用的方法,用于achieve abstraction(链接到我的博客)。我们来举一个Object.create方法的例子,如下所示。
var Logger = { log : function(log){} }
var ConsoleLogger = function() {};
ConsoleLogger.prototype = Object.create(Logger);
看看这个:https://github.com/haroldiedema/joii
var BaseClass = function()
{
this.some_var = "foobar";
/**
* @return string
*/
this.someMethod = function() {
return this.some_var;
}
};
var MyClass = new Class({ extends: BaseClass }, function()
{
/**
* @param string value
*/
this.__construct = function(value)
{
this.some_var = value;
}
})
用法:
var obj = new MyClass("Hello World!");
console.log(obj.someMethod()); // Hello World!