3

私が構築している多くのアプリケーションの OOP 継承パターンを設計しています。Javascript にはこれを行う多くの方法がありますが、私が本当に気に入っているパターンに出くわしました。しかし今、私はクラスとインスタンスを分離する必要性に苦しんでいます。

Root という基本オブジェクトがあります。そして、継承と呼ばれるメインメソッドがあります。使用する新しいオブジェクトを作成するには

var Person = Root.inherit({
    name : "",
    height : 0,
    walk : function() {},
    talk : function() {}
});

次に、「インスタンス」を作成するには、

var sally = Person.inherit({
    name : "sally",
    height : "5'6"
});

サリーは .talk() ができ、彼女は walk() ができ、.name と .height を持っています 同じ方法でより多くの人を作ることができます。

使用するコンストラクターが必要な場合

var Person = Root.inherit({
    _construct : function() {
        // do things when this object is inherited from
    },
    name : "",
    height : 0,
    walk : function() {},
    talk : function() {}
});

また、オブジェクトがコードで最初に定義されるときに init を持つ機能もあります (シングルトンはこれを使用します)。

var Person = Root.inherit({
    _init : function() {
        // called at runtime, NOT called if an object is inherited from me
    },
    name : "",
    height : 0,
    walk : function() {},
    talk : function() {}
});

ご覧のとおり、すべてが .inhert() を使用しています。実際にはクラスもインスタンスもありません。すべては何かのインスタンスです。これまでに見つけた唯一の本当の問題は、「タイプ」の概念がないことですが、必要に応じていつでもメソッドを確認できます。また、「クラス」を保護することはできません。開発者が誤って変更した場合、または変更しようとした場合、実行中に「クラス」が変更される可能性があるためです。

私の質問は次のとおりです。クラス構造とクラスのインスタンスを明示的かつ制御的に分離する必要がありますか? すべてのオブジェクトをインスタンスとして扱うことに問題はありますか?

4

6 に答える 6

4

Javascriptはプロトタイプベースの言語であるため、必要はありません。つまり、クラスは関与しません。オブジェクトのクローンを作成しているだけです。

http://en.wikipedia.org/wiki/Prototype-based_programming

タイプの概念に関しては、タイプはオブジェクトです。

これに関する詳細については、Stoyan StefanovによるJavascriptパターンをお読みください。彼は、4つのデザインパターンのギャングからのデザインパターンを実装する例など、懸念に対処するいくつかの異なる作成パターンを持っています。 http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752

于 2012-05-15T05:15:36.870 に答える
2

だから私の質問は:クラス構造とクラスのインスタンスの明示的かつ制御された分離を持つ必要があるjavascriptはありますか?すべてのオブジェクトをインスタンスとして扱うことに問題はありますか?

そうではありませんが、満足しているのであれば問題ありません。

JavaScript継承のより通常の形式は、ほとんど同じことを行います。このような構造が頻繁に見られます(簡潔にするために大幅に削減されています)

function Base() {
}
Base.prototype.foo = function() {
};

function Derived() {
}
Derived.prototype = new Base();

...そしてもちろん、のインスタンスnew Base()作成する方法でもあります。したがって、システムは非常に似ています。Base

繰り返しますが、上記はスケッチであり、完全な例ではありません。1つには、通常、構築と初期化が分離されているので、文字通り、 'sDerived.prototype = new Base()を使用してオブジェクトを作成するものはあまり見られませんが、実際に呼び出すことはありません(後で実行します)が、アイデアは得られます。確かに、そのステートメントはあなたのシステムとの類似性をいくらか弱めますが、それがそれを壊すとはまったく思いません。BaseprototypeBaseDerived

結局のところ、オブジェクト(インスタンス)がすべてです。オブジェクト(インスタンス)は、直接(your sally)、または他のオブジェクト(PersonRoot)に機能を提供することにより、クローンを作成するか、他のオブジェクトのプロトタイプとして設定することにより、間接的に使用されます。

于 2012-05-15T05:11:51.190 に答える
1

Javascriptの継承は典型的なものであり、すべてのオブジェクトがインスタンスであることを意味します。古典的な継承を取得するには、実際には追加の作業を行う必要があります。

于 2012-05-15T05:11:44.453 に答える
1

これは私がjavascriptで作業する方法です

// this is class
function person(){

    // data is member variable 
     this.name = null;
     this.id = null;

    //member functions 
     this.set_name = _set_name;
     this.get_name = _get_name;
     this.set_id = _set_id;
     this.get_id = _get_id;

 function _set_name(name){
    this.name = name;
 } 

 function _get_name(name){
    return this.name;
 }

     function _set_id(id){
    this.id = id;
 } 

 function _get_id(id){
    return this.id;
 }
}

// this is instance
var yogs = new person();

    yogs.set_id(13);
    yogs.set_name("yogs");

それが役立つことを願っています

于 2012-05-15T05:44:10.063 に答える
0

いくつかの基本的なオブジェクトから始めます...

// javascript prototypes - callback example - javascript objects

function myDummyObject () {
    that = this;
} // end function myDummyObject ()

// begin dummy object's prototype
myDummyObject.prototype = {
    that : this,

    // add a simple command to our dummy object and load it with a callback entry
    say : function () {
        var that = this;

        console.log('speaking:');
        that.cb.run("doSay");
    }
} // end myDummyObject proto        

サブプロトタイプで拡張..

// here we addon the callback handler... universally self sufficient object
var cb = {
    that : this, // come to papa ( a link to parent object [ myDummyObject ] )

    jCallback : new Array(new Array()),     // initialize a javascript 2d array 
    jCallbackID : -1,                       // stores the last callback id

    add: function(targetFnc, newFunc) {
        var that = this;
        var whichID = that.jCallbackID++;

        // target, addon, active
        that.jCallback[that.jCallback.length] =  { 'targetFunc' : targetFnc,  'newFunc' : newFunc,  'active' : true, 'id': whichID };

        return whichID; // if we want to delete this later...      
    }, // end add

    run: function(targetFnc) {
        var that = this;

        for(i=0;i <= that.jCallback.length - 1;i++) // go through callback list
            if( that.jCallback[i]['targetFunc'] == targetFnc  && that.jCallback[i]['active'] == true )
                that.jCallback[i]['newFunc'](); // run callback.
    }, // end run

    remove: function (whichID) {
        var that = this;
        console.log('removing:' + whichID); 

        for(i=0;i <= that.jCallback.length - 1;i++) // go through callback list
            if( that.jCallback[i]['id'] == whichID  )
                that.jCallback[i]['newFunc'](); // run callback.
    } // end remove
}                                                               

// add the object to the dummy object...
myDummyObject.prototype.cb = cb;

例:

var testing = new myDummyObject();

testing.cb.add('doSay', function () { console.log('test: 213123123'); } );

// test remove...
var testid = testing.cb.add('doSay', function () { console.log('test: 12sad31'); } );
testing.cb.remove(testid);

testing.cb.add('doSay', function () { console.log('test: asdascccc'); } );
testing.cb.add('doSay', function () { console.log('test: qweqwe'); } );
testing.cb.add('doSay', function () { console.log('test: d121d21'); } );
testing.cb.add('doSay', function () { console.log('test: wwww'); } );


testing.say();
于 2012-11-02T05:41:52.243 に答える