ホームページ  >  記事  >  ウェブフロントエンド  >  Javascriptの静的メソッドobject.extendの使用例を詳しく解説

Javascriptの静的メソッドobject.extendの使用例を詳しく解説

伊谢尔伦
伊谢尔伦オリジナル
2017-07-27 17:33:282771ブラウズ

クラスなので、抽象クラス、具象クラス、クラスの継承が存在します。同時に、クラスのメンバーはインスタンスメンバーと静的メンバーを持つことができます。

まず、プロトタイプ内の次のコードを見てください:

var Abstract = new Object(); 
Object.extend = function(destination, source) { 
for (property in source) { 
destination[property] = source[property]; 
} 
return destination; 
} 
Object.prototype.extend = function(object) { 
return Object.extend.apply(this, [this, object]); 
}

最初のコードは、オブジェクト Abstract を宣言しています。これは、メンバーを持たないため、空のクラスです。メンバー。これについては今は説明しないでください。これが抽象クラスの基礎であることがわかります。まず、次の構文について説明します。

function.member=function(){}

この場合、関数は一般に定義されています。このステートメントの機能は、関数に静的メンバーを追加することです。メンバーの内容は等号の後にあります。たとえば、上記の 2 番目のコード Object.extend=... は、静的メソッド extend を Object クラスに追加します。クラスの静的メンバーを定義する方法はわかりました。次に、インスタンス メンバーを定義する方法を知りたいと思うはずです。それは非常に簡単です。クラス名とメンバー名の間にプロトタイプを追加します。

function.prototype.member=function(){}

プロトタイプは、このように使用されますが、次のようにも使用されます:

function.prototype={ 
member1:function(){……}, 
member2:"abc", 
member3:function(){……} 
}

これは、インスタンス メンバーの定義がどのように実装されるかです。しかし、プロトタイプとは何を意味するのでしょうか?最初の記事では、オブジェクトを表すために直接 {} で囲むと述べました。たとえば、Prototype と Class はこのように定義されたグローバル オブジェクトです。次の使用法を見ると、prototype の後に {} 構造が続いていますが、これもオブジェクトですか?そうです、プロトタイプは実際にはオブジェクトです。 JavaScript では、次の構文を使用して、オブジェクトにメンバーを任意に追加できます:
object.member=function(){...}; この方法で定義されている限り、オブジェクトはすぐに member メソッドを持つことができます。 ! JavaScript はとても魔法です!
さて、プロトタイプがオブジェクトであり、関数が関数またはクラスであることがわかりました。その後、プロトタイプは、任意のクラス (関数) によって内部的に保持される静的メンバーと考えることができます。その機能は、このクラスのすべてのメンバー ポインターを格納することですが、これらのメンバーはプロトタイプにすぎず、初期化されていません。これは、プロトタイプの本来の意味にも一致します。プロトタイプ オブジェクトを通じて、いつでもメンバーを拡張できます。新しいクラスが作成されると、プロトタイプのメンバーが初期化され、インスタンス化されたオブジェクトに割り当てられます。
上記の 3 番目のコード、Object.prototype.extend=... は、インスタンス メソッド extend を Object に追加するもので、インスタンス メソッド内で、このクラスによってインスタンス化されたオブジェクト自体を指すこのポインターを参照できます。もちろん、このオブジェクトにはメンバー拡張があります。
次に進む前に、次の 2 つのステートメントを理解してください:

for(var p in object){} 
method.apply(object,arguments);

最初の文: 関数の場合は変数のすべてのメンバーをリストし、オブジェクトの場合はすべての静的メンバーをリストします。 p の型は文字列です。メンバーの名前を示します。 variabel.member を使用してメンバーを参照できるだけでなく、variabel["member"] を使用することもできます。同様に、割り当てについても同様です。これにより、変数のメンバーを列挙するのに非常に便利になります。

2 番目のステートメント: メソッドを実行のためにオブジェクトに適用します。パラメーターは引数の配列です。注: メソッドはオブジェクトのメンバーではありません。ただし、このステートメントの実行は object.method(arguments) を意味すると考えることができます。これは後で頻繁に使用する非常に重要な方法なので、徐々に慣れていきます。
extend を続けましょう。これは非常に重要なメソッドです。これはクラス Object の静的メンバーでもあり、インスタンス メンバーでもあることがわかります。見てみましょう。宛先とソースの 2 つのパラメータを受け取ります。宛先とソースが両方ともクラスの場合、その機能は、クラスのソースのすべての静的メンバーをクラスの宛先にコピーすることです。がコピーされます。このとき、移動先に同名のメンバーが存在する場合は上書きされます。つまり、宛先にソースのすべてのメンバーを含めると、関数はこの宛先を返します。 Object のインスタンス メンバーとしての extend を見てみましょう:

Object.prototype.extend = function(object) { 
return Object.extend.apply(this, [this, object]); 
}

最初は少しめまいがしますが、心配しないでください。apply 構文はメソッドです。 Object.extend は静的メソッドであり、obj であると仮定して、Object のインスタンスである this に適用されます。次の角括弧は、this と object の 2 つのメンバーを含む配列です。この配列は実際には、Object 静的メンバー extend の引数パラメーターです。この場合、このステートメントは

obj.extend(this,object); を実行することと同等です。これは説明されていませんが、それ自体を表しています。オブジェクトとは何ですか?パラメータは、インスタンス メソッド extend によって渡されるパラメータなので、混同しないでください。延長はどうするの? obj は extend インスタンスのメンバーを定義しませんが、apply を通じて Object の静的メンバー extend を使用できます。extend の関数本体を見てみましょう:

Object.extend = function(destination, source) { 
for (property in source) { 
destination[property] = source[property]; 
} 
return destination; 
}

因为obj是对象,object也是对象,即destination和source都是对象,于是函数的作用就是使obj具有object的所有成员。并且会返回obj。听起来有点拗口,但逻辑很简单:让obj“继承于”object!很好,我们看到了继承,但你肯定会问,对象的继承,第一次听说啊,我们讲继承都是讲的类的继承。没错,现在的确还没有看到真正的类继承,但已经近在眼前了:类不就是有个prototype吗,而prototype是对象!
好,想到这一点,类的继承语法看似很简单了:

b.prototype.extend(a.prototype);

让b继承a。
可是事实却没那么简单:prototype是存放方法原型指针,extend方法没有初始化,不能使用!要使用extend,就必须实例化一个对象。还是看看prototype是怎么做的吧:

b.prototype=(new a()).extend(b.prototype);

很高明的办法!充分说明了函数其实也是一个变量的道理。先实例化a对象,然后在它基础上调用extend,将所有的成员b.prototype的成员覆盖到a的对象,然后把这个a对象再赋值给b.prototype。完成了b从a继承的工作。在实际使用中,一般的用法都是:

b.prototype=(new a()).extend({});

因为让一个b继承自a,通常b之前都是一个未定义的类,所以后面的{}中其实就可以定义类成员。当然,你也可以先定义,再继承,只是和传统概念有所区别了。 

以上がJavascriptの静的メソッドobject.extendの使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。