7

編集:最終的にベルギの答えからそれを理解しました。

ありがとうベルギ。

pubPrivExample = (function () {
    return {
        init : function () {
            var private;

            this.setPrivate = function (p) {
                private = p;
            };
            this.getPrivate = function () {
                return private;
            };
        },

        public : "This is public\n"
    };
}());

var a;

a = Object.create(pubPrivExample);
a.init();
a.setPrivate("This is private");

document.write(a.getPrivate());

編集:私の質問への答えは、接線で外れているようです。私は工場にはまったく興味がなく、実際には if を使用したくありません。私の質問は私立についてです。Bergi の回答とコメントから、何かをまとめることができると思います。

つづく...

編集: Bergi は以下の質問に答え始めましたが、最も重要な部分である私的な状態を省略しました。

私はアイデアについてもっと考える時間がありましたが、ある種のファクトリなしで Object.create() を使用してプライベート状態を達成することはまだできません。しかし、私は間違っていて、Bergi は解決策をほのめかしました... Bergi の答えを出発点として自由に受け取ってください。

ORIGINAL: newJavaScript で回避するという私の探求は、私を独特の場所に導きました。プライベート オブジェクト メンバーが必要ですが、あきらめたくありませんObject.create()

これがコードです。

var trackQueue = {};

trackQueue.factory = function () {
    var that, queue;
    that = this;
    queue = [];

    that.push = function (item) {
        queue.push(item);
    };

    that.work = function () {
        document.write(queue + "<br />");
    };

    return {
        work : that.work,
        push : that.push
    };        
};

var a = Object.create( trackQueue.factory() );
a.push("a");
a.push("b");
a.push("c");

var b = Object.create( trackQueue.factory() );
b.push("d");
b.push("e");
b.push("f");

a.work();
b.work();

そしてjsfiddle

http://jsfiddle.net/dsjbirch/Wj6cp/10/

initメソッドのより慣用的な/適切な名前でしょうかfactory?

これは非常識ですか?

親切にしてください - JavaScript は私の第一言語ではありません。

4

2 に答える 2

2

はい、プロトタイプのinitメソッドがより適切な名前である可能性があります。

var proto = {
    init: function(args) {
        // setting up private-scoped vars,
        var example = args;
        // privileged methods
        this.accessPrivate = function(){ return example; };
        // and other stuff
        this.public = 5;
    },
    prop: "defaultvalue",
    ...
}

var instance = Object.create(proto);
instance.init();

Object.createただし、 andinit呼び出しをエレガントに組み合わせたnewキーワードで従来のコンストラクターを使用しない理由はまったくありません。

Object.createまた、まったく使用せずに使用していることに注意してください。ファクトリパターン(完全に有効な適用)は、適切なオブジェクトを返します。それらを継承するオブジェクトごとに新しいオブジェクトを作成する必要はありません。ただ行う:

var instance = trackQueue.factory();

メソッド名「create」のサウンドが気に入った場合は、ファクトリにもっと慣用的な名前を使用できます。

trackQueueFactory.create = function(args) {...};

編集:ファクトリパターンをプロトタイプの継承と組み合わせるというあなたの考えはそれほど間違っていません。ただし、作成されたすべてのオブジェクトが継承するプロトオブジェクトは、呼び出しごとに新しいオブジェクトを作成するのではなく、静的である必要があります。コードは次のようになります。

var factory = {
    proto: {
        ...
    },
    create: function(args) {
        var product = Object.create(this.proto);
        // set up private vars scoped to the create function
        // privileged methods
        product.doSomethingSpecial = function(){ ... };
        // and other stuff
    }
};

var a = factory.create(...);
于 2012-06-28T22:30:11.020 に答える
2

これは、要件を達成するための明確な方法だと思います。

var personFactory = function(id, name, age){
    var _id = id;
    var _name = name;
    var _age = age;

    var personPrototype = {
        getId: function(){
            return _id;
        },
        setId: function(id){
            _id = id;
        },
        getName: function(){
            return _name;
        },
        setName: function(name){
            _name = name;
        },
        getAge: function(){
            return _age; 
        },
        setAge: function(age){
            _age = age;
        },
        work: function(){
            document.write(this.toString());
        },
        toString: function(){
            return "Id: " + _id + " - Name: " + _name + " - Age: " + _age;
        }
    };

    return Object.create(personPrototype);
};

使用法:

var renato = personFactory(1, "Renato Gama", 25);
console.log(renato.getName()); //logs "Renato Gama"
renato.setName("Renato Mendonça da Gama");
console.log(renato.getName()); //logs "Renato Mendonça da Gama"

私が間違っていなければ、これは MODULE PATTERN の使用法の 1 つです。より良い説明については、この投稿を参照してください。これは、主題に関する良い投稿でもあります。

于 2012-07-02T04:53:28.217 に答える