5

私がこのようなオブジェクトを持っていると仮定します:

var Foo = {
  x: 5,
  sprite: new Image()
}

問題:そのスプライトを正しいsrcで初期化したい。ただし、次の作成手法を使用すると、次のようになります。

var f = Object.create(Foo);

セットアップするコンストラクターメソッド(別名init関数)がありませんsprite.src = 'cool.png';

私の質問:

オブジェクトリテラル手法を使用している場合、およびObject.create()、実際に内部状態の一部を初期化するのはいつですか(の例のようにnew Image()

私の解決策:

var Foo = {
  create: function() {
    var f = Object.create(Foo);
    f.sprite.src = 'cool.png';
    return f;
  }
}

しかし、それが素晴らしいパターンかどうかはわかりません。方法があれば、これを「JavaScriptWay」にしたいです。:)

ありがとう!

4

5 に答える 5

6

私はあなたが上で書いたことと非常に似た何かをしますが、それをモジュールパターンと組み合わせます:

var Vehicle = (function(){
        var exports = {};
        exports.prototype = {};
        exports.prototype.init = function() {
                this.mph = 5;
        };
        exports.prototype.go = function() {
                console.log("Going " + this.mph.toString() + " mph.");
        };

        exports.create = function() {
                var ret = Object.create(exports.prototype);
                ret.init();
                return ret;
        };

        return exports;
})();

外部から、これはとを公開Vehicle.create()Vehicle.prototypeます。次に、派生型を作成する場合は、次のように実行できます。

var Car = (function () {
        var exports = {};
        exports.prototype = Object.create(Vehicle.prototype);
        exports.prototype.init = function() {
                Vehicle.prototype.init.apply(this, arguments);
                this.wheels = 4;
        };

        exports.create = function() {
                var ret = Object.create(exports.prototype);
                ret.init();
                return ret;
        };

        return exports; 

})();

このパターンを使用すると、コンストラクターがパラメーターを受け取る場合に失敗するCar.prototype = new Vehicle()、のエラーを発生させずに型を派生させることができます。

于 2011-04-05T01:03:46.870 に答える
4

このリンクから推測できるように、次のようなことを行う必要があります。

function ImgInstance(src){
    var img=new Image();
    img.src=src;
    return img;
}

Object.create(Foo, {sprite: {value: ImgInstance("url")}});
于 2011-01-31T21:01:54.033 に答える
1

この記事はそれをかなりうまくまとめていると思います:

http://www.bennadel.com/blog/2184-Object-create-Improves-Constructor-Based-Inheritance-In-Javascript-It-Doesn-t-Replace-It.htm

于 2013-02-08T11:25:23.030 に答える
0

私は単にこれを行います:

function Image(src) {
    this.src = src;
}

function Foo() {
    this.x = 5;
    this.sprite = new Image('cool.png');
}
于 2011-01-31T20:20:59.643 に答える
-10

長い話を短くするために:試してはいけません。Object.createの基本的な考え方は、コンストラクター関数を回避することです。この古き良きパターンを使用する方が良いでしょう:

var Foo = function (url) {
    //this.sprite.src = url; //  This will overwrite the prototype's src
    this.sprite = new Image();
    this.sprite.src = url;
};
Foo.prototype = {
    x: 5,
    sprite: new Image() // do you really want this?
};

次に、new Fooの代わりに使用しObject.createます。

于 2011-01-31T21:22:55.280 に答える