社会では、人の能力や価値を評価する際、「人間関係によるもの」と「能力によるもの」の2つの異なる基準が存在することがよくあります。どちらの基準も、異なる文化、業界、個人の価値観で具体化されており、それぞれに独自の支持者と批判者がいます。
プログラミング言語内には、異なる方法でコードを編成し、データ構造を関数にリンクする 2 種類の標準があります。この記事では、これら 2 つの共通標準の適用と動作原理について簡単に説明します。
JavaScript 言語では、クラスを定義するために使用できる class キーワードが提供されます。重要なのは、クラスは拡張可能であり、メソッドがインスタンス上で呼び出されるとき、プロトタイプ チェーンの順序でメソッド定義を検索することです。例えば:
class Animal { move() { return 'move' } } class Monkey extends Animal { jump() { return 'jump' } } class Human extends Monkey { write() { return 'write' } }
extends キーワードは、他のクラスから拡張する新しいクラスを定義するのに役立ちます。次のようにプロトタイプチェーンを取得できます:
let me = new Human() let proto = me.__proto__ let r = [] while (proto !== null) { r.push(proto.constructor.name) proto = proto.__proto__ }
次のように r を取得します: ['Human', 'Monkey', 'Animal', 'Object']。メソッドを呼び出すとき、メソッド呼び出しが成功するかどうかは、プロトタイプ チェーンに対応する定義があるかどうかによって決まります。たとえば、me.move() を呼び出すと、Animal クラスに定義があり、呼び出しは成功します。
これはクラス モデルです。私はこれを「リレーショナル」モデルと呼びます。インスタンス自体のクラス、または親クラス、祖父母クラスなどで定義されている限り呼び出すことができます。の上。
関係ベースのモデルと比較して、コンピテンシーベースのモデルははるかに単純です。インスタンスが特定の特性を満たす限り、インスタンスの関係に関係なく、対応するメソッドはインスタンスに対して動作します。
let me = { moveable: true, freezable: false } function move(x) { return x.moveable ? 'move' : undefined } function freeze(x) { return x.freezable ? 'freeze' : undefined }
このモデルでは、データとメソッドは互いに独立しています。利点は簡潔でわかりやすいことですが、欠点は明らかです。メソッドとデータが独立しているため、メソッド定義をオーバーライドするのが困難です。
データ構造とメソッドを接続する 2 つの方法を紹介した後、データのクラスに応じて、同じ名前の異なる関数を持つメソッドを実装する必要がある場合は、リレーショナル クラス モデルを使用することが推奨されると考えられます。 。通常、メソッドが比較的固定されており、データが変更可能であり、同じメソッドが異なるデータで機能する場合は、コンピテンシーベースのモデルを使用できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3