[解決済み】JavaScriptのクラスとスタティックメソッドの比較
質問
これがうまくいくことは分かっています。
function Foo() {};
Foo.prototype.talk = function () {
alert('hello~\n');
};
var a = new Foo;
a.talk(); // 'hello~\n'
しかし、もし私が
Foo.talk() // this will not work
Foo.prototype.talk() // this works correctly
を作成する方法をいくつか見つけました。
Foo.talk
を動作させます。
-
Foo.__proto__ = Foo.prototype
-
Foo.talk = Foo.prototype.talk
他の方法はないのでしょうか?そうすることが正しいかどうかわからない。あなたのJavaScriptのコードでは、クラスメソッドやスタティックメソッドを使用していますか?
どのように解決するのですか?
まず最初に、JavaScriptは主に
プロトタイピング言語
というより、むしろ
クラスベース言語
1
.
Foo
はクラスではなく、関数であり、オブジェクトである。オブジェクトをインスタンス化することができます
から
その関数は
new
というキーワードで、標準的なOOP言語におけるクラスと同様のものを作成することができます。
を無視することをお勧めします。
__proto__
クロスブラウザのサポートが不十分なため、ほとんどの場合、その代わりに
prototype
が動作します。
関数から生成されたオブジェクトのインスタンスがある場合 2 そのメンバー(メソッド、属性、プロパティ、定数など)に何らかの方法でアクセスすると、(a)そのメンバーが見つかるか、(b)他のプロトタイプが見つからないか、のどちらかになるまで、アクセスはプロトタイプ階層を下っていくことになります。
階層は、呼び出されたオブジェクトから始まり、そのプロトタイプオブジェクトを検索します。プロトタイプオブジェクトにプロトタイプが存在する場合はこれを繰り返し、プロトタイプが存在しない場合はこれを繰り返す。
undefined
が返されます。
例えば
foo = {bar: 'baz'};
console.log(foo.bar); // logs "baz"
foo = {};
console.log(foo.bar); // logs undefined
function Foo(){}
Foo.prototype = {bar: 'baz'};
f = new Foo();
console.log(f.bar);
// logs "baz" because the object f doesn't have an attribute "bar"
// so it checks the prototype
f.bar = 'buzz';
console.log( f.bar ); // logs "buzz" because f has an attribute "bar" set
この「基本的な部分」については、すでにある程度理解されているようですが、念のため、明示する必要がありますね。
JavaScriptでは、すべてがオブジェクトである 3 .
すべて はオブジェクトです。
function Foo(){}
は単に新しい関数を定義しているわけではなく、新しい関数オブジェクトを定義しています。
Foo
.
にアクセスできるようになるわけです。
Foo
のプロトタイプを
Foo.prototype
.
を設定することもできます。
その他の機能
オン
Foo
:
Foo.talk = function () {
alert('hello world!');
};
この新機能は、以下の方法でアクセスできます。
Foo.talk();
ここまでで、関数オブジェクトの関数と静的メソッドが似ていることにお気づきでしょうか。
を考えてみてください。
f = new Foo();
は、クラスのインスタンスを作成するのと同じです。
Foo.prototype.bar = function(){...}
をクラスの共有メソッドの定義として、そして
Foo.baz = function(){...}
をクラスの public static メソッドとして定義しています。
ECMAScript 2015では、この種の宣言に対して様々な構文シュガーが導入され、実装をシンプルにしつつ読みやすくなっています。したがって、前の例は次のように書くことができます。
class Foo {
bar() {...}
static baz() {...}
}
これは
bar
として呼び出すことができます。
const f = new Foo()
f.bar()
と
baz
として呼び出されるようにする。
Foo.baz()
<サブ
1:
class
は、ECMAScript 5 仕様において "Future Reserved Word" であった。
を使用してクラスを定義する機能が導入されました。
class
というキーワードがあります。
<サブ 2: 本来はコンストラクタで生成されるクラスインスタンスだが、ニュアンスの違いが多いので誤解を招かないようにしたい
<サブ
3:
プリミティブ値
-を含む。
undefined
,
null
ブーリアン、数値、文字列は、低レベルの言語実装なので、厳密にはオブジェクトではありません。ブール値、数値、文字列は、あたかもオブジェクトであるかのようにプロトタイプチェーンと相互作用します。
関連
-
[解決済み】JS ファイルが net::ERR_ABORTED 404 (Not Found) を取得する)
-
[解決済み】リソースはドキュメントと解釈されるが、MIMEタイプはapplication/zipで転送される
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Heroku:ノードアプリで「このアプリにはデフォルトの言語が検出されませんでした」エラーがスローされる
-
[解決済み】node.js TypeError: path must be absolute or specify root to res.sendFile [JSONのパースに失敗しました]。
-
[解決済み】JavaScriptのgetElementByNameが機能しない
-
[解決済み】別のjsファイル内でJavaScriptの関数を呼び出す
-
[解決済み】SyntaxError: ChromeのJavascriptコンソールでUnexpected Identifierが発生する。
-
[解決済み】Reactのeslintエラーはpropsの検証で見つからない
-
[解決済み】Kendo Observable Bindingと併用する場合、Kendo Switch Labelsを変更することは可能ですか?[Kendo-UI]です。
-
[解決済み】このオブジェクトの "forEach "はなぜ関数でないのですか?
-
[解決済み】Uncaught ReferenceError。Firebase は定義されていません。
-
[解決済み】未定義のプロパティ 'forEach' を読み取ることができない