1

次のように定義された JavaScript オブジェクトがあります。

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

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

    return Object;
})();

問題は、これが構築されると、元の機能Object.definePropertyなどを失うことです。

アイデアは、既存のプロトタイプを書き直したり上書きしたりするのではなく、オブジェクトの基本機能を拡張したいということです。

これはどのように達成できますか?

編集:明確にするために、元の機能に影響を与えることなくこれを実行できることを知っています:

Object.prototype.foo = function() { }

しかし、オブジェクトのコンストラクターに機能を具体的に追加する必要があります。つまり、

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

新しい機能が元の機能を上書きしてはなりません。

4

3 に答える 3

3

を使用し.prototypeてプロパティを追加します。

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

そして、次のように使用します。

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

のプロトタイプにプロパティを追加することはお勧めしませんが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
    }
});
于 2013-05-17T14:18:33.540 に答える
0

イアンが書いたようにしてください。また、メソッドがすでに存在することを確認したい場合は、使用します

if (Object.prototype.specialMethod == null) Object.prototype.specialMethod = function() { ... };
于 2013-05-17T14:23:33.477 に答える
0

このオブジェクトを拡張するには、オブジェクトの新しいインスタンスが割り当てられたプロトタイプを持つ別のオブジェクトを作成する必要があります。

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は不要だと思います。

于 2013-05-17T14:20:26.670 に答える