1

Javascriptを学んでいますが、質問がありますprototype

この場合のプロトタイプは、すべてのインスタンスが共有しているため、PHP静的メソッドに似ていますか?

Javascript

var Person = function(){
   this.name = "Test Person";
}

Person.prototype.work = function(){
   return this.name + "is working";
}

PHP

class Person($personName){

   public static working(){
      return $personName . "is working";
   }
}

$person1 = new Person("Joe").working();
$person2 = new Person("Mike").wokring();
4

2 に答える 2

2

そうではありません。プロトタイプの継承に関するDougCrockfordの記事を読んx.prototypeで、Javascriptの意味と、それがより「古典的な」継承にどのように関連するかを理解することをお勧めします。ウィキペディアには、概念に役立つ可能性のあるエントリもあります。

于 2013-03-25T05:33:56.100 に答える
2

技術的な答えはノーです。プロトタイプ化された関数の基本的な実装は、Cのような言語での静的メソッドの実装と同じではありません。

...ただし、実際には、それらの一般的な使用法はpublic-staticメソッドに類似していると見なすことができます。
public-staticメンバーと比較して、プロトタイプ化されたプロパティの方が似ています。

それらは同じように呼ばれるわけではありませんが、「クラス」/コンストラクター上にあり、各インスタンスにアクセス可能であり、これらの値を共有値として変更し、他のすべてのインスタンスに影響を与えるメソッドまたはプロパティの概念は非常に重要です、非常によく似ていpublic staticます。

ただし、覚えておくべきことが他にもいくつかあります。これは、public static使用する言語に応じて、機能と見なすものと一致します...

もちろん、最も重要なのは、プロトタイプ化された関数の観点から、パブリックにアクセスできないプライベート/インスタンス固有の状態にまったくアクセスできないことです。したがって、プライベートメソッドを呼び出したり、インスタンス固有の変数(パブリックメンバーではない)を使用したりできる関数
の処理に慣れている場合は、120%運が悪いことになります。public static

考慮すべき2番目のことは、クロージャーを介してパブリックおよびプライベートの静的メンバー/メソッドに相当するものを作成することもできるということです。

var Class = (function () {
    var private_static_method = function () {},
        public_static_method  = function () {},
        private_static_property = 1,
        public_static_property = 2,

        class_constructor = function (a, b) {
            var private_method = function () {},
                public_method  = function () {},
                public_property  = a,
                private_property = b,

                public_interface = {
                    method   : public_method,
                    property : public_property
                };

            return public_interface;
        };

    class_constructor.method   = public_static_method;
    class_constructor.property = public_static_property;
    return class_constructor;
}());

これで、クロージャを通じて、すべてのプライベートインスタンスがアクセスできる「プライベート静的」関数とプロパティが得られました。
コンストラクター関数のメソッドとして追加したパブリック静的メソッドがあります。次に、を使用せず、必要なものをアタッチする新しいオブジェクト()を作成する
コンストラクター関数を取得しました。 インスタンスのパブリックメソッドはすべて、クロージャのおかげで、そのインスタンスのプライベートメソッド/変数にアクセスできます。 newpublic_interface

これは、従来のクラスとは何の関係もありません。
しかし、純粋にクロージャーベースの観点からすると、これは、クラスをJSに押し込もうとせずに、これらのアクセスタイプをすべて再現する方法です。

于 2013-03-25T05:50:46.940 に答える