JavaScript:基于现有类创建自定义类的新对象(向其添加方法)

时间:2012-02-06 06:40:06

标签: javascript object

我使用iOS UI Automation framework确保my iPhone app岩石。

使用这个框架的每个人都会告诉你它很棒,但它缺乏很多结构。

所以我必须处理UIAWindow的实例,这些实例代表我应用的不同屏幕。为了更加面向对象,我想为每个屏幕设置一个特定的类,所以我可以添加特定的方法,比如

myScreen1.tapDoneButton();
var total = myScreen2.getNumberOfElements();

目前,我可以通过将UIAWindow的实例传递给将添加适当方法的函数来实现这一目标,如下所示:

function makeMainScreen(actualScreen)
{   
    actualScreen.constructor.prototype.getAddButton = function() {
        return this.buttons()["add button"];
    };
    actualScreen.constructor.prototype.tapAddButton = function() {
        this.getAddButton().tap();
    };
    // Add any desired method...

return actualScreen;
}

它工作正常,我这样使用它:

var mainScreen = makeMainScreen(app.mainWindow());
mainScreen.tapAddButton();

但这似乎不够面向对象,我想使用 new this 关键字创建真实对象,所以我要声明像这样:

function MainScreen(actualScreen){
  // This line doesn't work : because 'this' is immutable
  this = actualScreen;

  this.tapAddButton = function(){
    this.getAddButton().tap();
  }

  //...

}

我会像这样使用它:

var mainScreen = new MainScreen(app.mainWindow());
mainScreen.tapAddButton();

我以为我可以将actualScreen保存为对象的属性(如下面的Grace Shao的回答),并调用其上的所有方法,但我想保留原始的UIAWindow方法。

有人知道怎么做吗? 或者也许我想要实现的目标没有意义,在这种情况下我会很高兴知道。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以尝试以下方法:

function MainScreen(actualScreen){
    this.screen = actualScreen;
}

MainScreen.prototype.tapAddButton = function () {
    this.screen.getAddButton().tap();
};

MainScreen.prototype.getScreen = function () {
    return this.screen;
};

//...

var mainScreen = new MainScreen(app.mainWindow());

mainScreen.tapAddButton();

您无法为this分配任何内容。您还可以在构造函数MainScreen中定义方法,但它们将被视为特权成员。

function MainScreen(actualScreen){
    this.screen = actualScreen;

    this.tapAddButton = function () {
        this.screen.getAddButton().tap();
    };
}

如果您不希望它们成为特权成员,最好在构造函数外部定义它们。否则,每次实例化新对象时,都会一次又一次地初始化成员。

<强>更新: 你也可以在构造函数中使用screen的方法包装器,如下所示。

var prop;

for (prop in actualScreen) {
    if (typeof actualScreen[prop] !== 'Function') {
        continue;
    }
    this[prop] = function () {
        return actualScreen[prop].apply(actualScreen, arguments);
    };
}