簡體   English   中英

JavaScript有條件地覆蓋類方法

[英]JavaScript override class method conditionally

我有一個我定義的類,我在我的應用程序中使用。 我有一個頁面,我想更改覆蓋該類的所有實例上的一些方法。 這是一些代碼來說明。

MyClass的-的script.js

var MyClass = new Class({
    foo: function() {
        return 1;
    },

    bar: function() {
        return this.foo() + 9;
    },
});

變化MyClass的-的script.js

MyClass.implement({
    foo: function() {
        return this.parent() * -1;
    },
});

如果我在頁面上包含myclass-script.js,我應該看到:

var test = new MyClass();
test.bar() === 10; //true

如果我包含myclass-script.js然后更改-myclass-script.js,我應該看到:

var test = new MyClass();
test.bar() === 8; //true

我遇到的問題是MyClass.implement適用於MyClass的所有實例,但它沒有“覆蓋”該方法,它取代了它。 所以this.parent()調用失敗,因為該方法沒有父級。 如果我做MyClass.extend它不適合我想要的,我沒有看到MyClass的實例調用重寫方法。

您可以存儲舊版本的foo,基本上是Dimitar所做的:

var foo = MyClass.prototype.foo;
MyClass.implement('foo', function(){
    return foo.call(this) * -1;
});

或者您可以使用previous方法從MooTools More中使用Class.Refactor

Class.refactor(MyClass, {
    foo: function(){
        return this.previous() * -1;
    }
});

不確定這是否是最好的做法,但它可以讓你運行你想要的任何邏輯或只是返回原始方法,如果不需要...

var MyClass = new Class({
    foo: function() {
        return 1;
    },
    bar: function() {
        return this.foo() + 9;
    }
});

var f = new MyClass();
console.log(f.bar()); // 10

(function() {
    var orig = MyClass.prototype.foo;
    MyClass.prototype.foo = function() {
        return orig.apply(this, arguments) * -1; 
    };
})();

console.log(f.bar()); // 8

http://www.jsfiddle.net/dimitar/cXTrD/7/

嘗試執行以下操作:

MyClass.prototype.implement({

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM