5

JavaScriptでOOPを把握するのは本当に難しいと思います。

通常、クラスを作成してから、そのクラスからオブジェクトを作成する必要があると思います。

ただし、あるチュートリアルによると、次のようにオブジェクトが作成されます。

var egg = {}

実際にクラスを作成せずに、卵という名前のオブジェクトを作成しただけではありませんか。

その場合、オブジェクトから複数のオブジェクトを作成するにはどうすればよいですか :S

また、別のチュートリアルによると、オブジェクトは以下のように作成されます。これは、上記で言われたこととは完全に異なります:S

var Block = function(){

}

誰かが私の混乱を解明するのを手伝ってくれますか:(

4

6 に答える 6

14

上記の例はどちらも正しいです。簡単に言えば、javascript のすべてがオブジェクトです。クラスは存在しませんが、それらを模倣する方法はたくさんあります。私のお気に入りの方法は次のとおりです。

    var myClass = function() { <----------------------------- class declaration

            var prop1,   
                prop2,   <------------------------------------ private properties
                prop3;

            var addMe = function( arg1, arg2 ) { <------------ private method
                var result = arg1 + arg2;
                return result;
            }

            var obj = { <------------------------------------- constructor method 
                Prop1: prop1,
                Prop2: value2,  <----------------------------- public properties
                Prop3: value3,

                Method: function() { <------------------------ public method
                    obj.prop3 = obj.prop1 + obj.prop2;   
                    return obj.prop3;
                }
            }

            obj.Prop4 = addme( prop1, prop2 ); <-------------- public property set 
                                                               with the private method
            return obj;
    }

    var myClassObj = new myClass;

myClassObj は、Prop1、Prop2、Prop3、Prop4 の 4 つのパブリック プロパティと、Method という 1 つのパブリック メソッドを持つ myClass のオブジェクトになりました。

于 2012-07-13T22:35:44.640 に答える
3

実際にクラスを作成せずに、eggという名前のオブジェクトを作成しただけではありませんか。

それは正しい。そこで行っているのは、ベースオブジェクトをインスタンス化することだけです。インスタンスObject作成できるものは何も作成していません。

JavaScriptには、クラスの形式化された概念はありません。関数を呼び出すのではなく、インスタンス化することによって実現される、クラスのシミュレーションだけがあります。

function Animal() { this.animal = true; }
Animal.prototype.sayHi = function() { alert(this.name+' says hi!'); }
function Dog(name) { this.name = name; }
Dog.prototype = new Animal();
...
var fido = new Dog('Fido');
fido.sayHi(); //"Fido says hi!";

4行目は、継承をシミュレートするいくつかの手段の1つにすぎないことに注意してください。

したがって、JavaScriptでは、クラスと関数はどちらも単なる関数です。インスタンス化を目的とした関数がnewオペレーターなしで呼び出されるのを防ぐための固有の機能はなく、その逆もありません。

前者の場合、一般的な回避策は、コンストラクターが「クラス」であることを確認し(呼び出されてインスタンス化されていない場合、コンストラクターはインスタンス化されますObject)、必要に応じて再ルーティングします。

function Dog(name) {
    //if we weren't instantiated, the constructor will be Object, not Dog
    if(this.constructor != Dog) return new Dog(name);
    this.name = name;
}
var fido = Dog(); //bad - invocation should be instantiation
于 2012-07-13T22:22:09.733 に答える
3

はいvar egg = {}、オブジェクトですが、オブジェクトのインスタンスではありません。

JavaScript では、単純にそのように何かを言うことは、基本的に js のシングルトンの考え方です。つまり、まさにそれが等しいということです。

//this is a js singleton, and all properties of this object are public.
var egg = {
    name: 'humpty',
    smush: function() { console.log('splat!'); },
    weight: '4oz'
};
console.log(egg.weight); //4oz

一方、より伝統的なタイプのオブジェクトは、インスタンス化できる関数にすることです。

var Egg = function( name, weight ) {
    var name = name;
    this.smush = function() { console.log('splat!'); }
    this.weight = weight;
};
var e2 = new Egg('dumpty','6oz');
console.log(e2.name); //will not return name. (since i wrote var name and not this.name, its "private" and thus cannot be accessed.)
console.log(e2.weight); //4oz
于 2012-07-13T22:30:49.690 に答える
3

Javascript は、これまでに学習した言語とは異なります。言語を変更したときとまったく同じように機能することは期待できません。

簡単なプレビュー: JavaScript では、関数を変数に割り当てることができます。私はあなたが使用した他の言語に賭けますが、それは不可能でした:

var myCounter = 1;
var myFunction = function(x){ return x + 1; };

質問に戻ります: JavaScript には「実際のクラス」はありません。オブジェクトがあるだけです。最初は混乱するかもしれません。

Javascript のオブジェクト モデルは「プロトタイプ継承」と呼ばれます。「古典的な」(しゃれを意図した) 継承とは異なります。また、あまりきれいに実装されていません。

基本的に、縮小されたオブジェクトのセット (配列、関数、オブジェクトなどはクラスではなくオブジェクトです) から始めて、それらのオブジェクトを使用して他のオブジェクトを構築します。それらの間の関係は「クラスとインスタンスのような」ものにすることができますが、そうである必要はありません。それらは他の種類の関係でもありえます。

クラスがないため、作成できません。しかし、通常のオブジェクトを作成し、それを変数 Car に割り当てて、「このオブジェクトを使用して他の多くのオブジェクトを作成するつもりです。これらの他のオブジェクトには、メソッドやその他のものなど、デフォルトでいくつかの属性があります。彼らが車のように振る舞うように」. そして、言語はそれを可能にします。Car は他の言語のクラスと同じように動作し、それが生成するオブジェクトは「Car のインスタンスのようなもの」になります。

ただし、javascript から見ると、それらは何らかの関係を持つオブジェクトのように見えます。

ある意味で、プロトタイプ継承は古典的継承の「スーパーセット」です。古典的な継承だけでなく、他のこともできます。

于 2012-07-13T22:54:07.093 に答える
2

JavaScript の「プロトタイプの継承」を見たいとします。 http://www.crockford.com/javascript/inheritance.html

于 2012-07-13T22:51:14.583 に答える