簡體   English   中英

如何在JavaScript中擴展Object而不會丟失原始功能

[英]How to extend Object in JavaScript without losing the original functionality

我有一個像這樣定義的JavaScript對象:

var Object = (function () {
    function Object() {
        this.id = RandomNumber();
    }

    // Custom Object.prototype / Object impementations here...

    return Object;
})();

問題是,一旦構建它,它就會失去像Object.defineProperty等原始功能。

我的想法是,我想擴展Object的基本功能,而不是重寫或覆蓋現有的原型。

怎么能實現這一目標?

編輯:為了清楚,我知道我可以做到這一點而不影響原來的功能:

Object.prototype.foo = function() { }

但我需要專門為Object的構造函數添加功能,即

function Object() { this.id = 0; }

新功能不得覆蓋原始功能。

使用.prototype添加屬性:

Object.prototype.specialMethod = function () {
    // Your method's code
};

你會像以下一樣使用它:

var a = {};
a.specialMethod();

雖然我不鼓勵在Object的原型中添加屬性,因為它是可枚舉的並且會使循環陷入混亂,並且將被所有對象和從Object繼承的Object繼承,這基本上就是一切。

您實際上可以使用您提到的Object.defineProperty方法:

Object.defineProperty(Object.prototype, "specialMethod", {
    enumerable: false,    // The important one, to avoid looping problems
    configurable: false,
    writable: false,
    value: function () {
        // Your method's code
    }
});

為了擴展此對象,您應該創建另一個對象,該對象的原型分配了一個新的Object實例。

var Object = (function () {
    function Object() {
        this.id = 5;
    }

    Object.prototype.speak = function(prop){
       alert(this[prop]);
    }

    return Object;
})();

function ExtendsObject(prop){
    this.someProperty = prop;
}

ExtendsObject.prototype = new Object();

var xObj = new ExtendsObject("derived");
xObj.speak("id");
xObj.speak("someProperty");

工作示例: http //jsfiddle.net/RbCcA/

如果你想堅持使用自執行函數,那么重寫的例子是:

var Object = (function () {
    function Object() {
        this.id = 5;
    }

    Object.prototype.speak = function(prop){
       alert(this[prop]);
    }

    return Object;
})();

var ExtendsObject = (function(){

    function ExtendsObject(prop){
       this.someProperty = prop;
    }

    ExtendsObject.prototype = new Object();

    return ExtendsObject;
})();

var xObj = new ExtendsObject("derived");
xObj.speak("id");
xObj.speak("someProperty");

工作示例: http //jsfiddle.net/RbCcA/1/

我確實質疑在這種情況下使用自執行功能。 它們通常用於封裝和屏蔽內部,但在代碼示例中,它們通過從SEF返回對象來暴露。 返回對象並將其存儲在全局變量中只需重新公開對象,從而允許對其原型和屬性進行操作。 也許你沒有提到私人變量,但正如所述,我發現SEF是不必要的。

就像伊恩寫的那樣。 如果您還想檢查它已經存在的方法使用

if (Object.prototype.specialMethod == null) Object.prototype.specialMethod = function() { ... };

暫無
暫無

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

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