0

デジタル企業のアーキテクトの 1 人とのミーティングで、オブジェクト指向と非オブジェクト指向の JavaScript の違いは何かと尋ねられました。

残念ながら、私はこれに適切に答えることができず、javascript はオブジェクト指向言語のみだと思うと答えただけです。

JavaScriptのオブジェクト指向設計では、ポリモーフィズムなどの通常のoopプロシージャを使用できることを知っています。

これについてどう思いますか?そのような違いはありますか?2つを分離できますか?

4

2 に答える 2

3

ほとんどのオブジェクト指向言語は、OO 以外の方法で使用できます。(ほとんどの非 OO 言語は、OO の方法でも使用できます。そのためには、努力する必要があります。) JavaScript は、手続き型と関数型の両方の方法で使用するのに特に適しています (また、非常に適しています)。 OO のさまざまな方法で使用されます)。非常に柔軟な言語です。

たとえば、人に関する情報を処理する必要があるものを書き、年齢を示す 2 つの方法を次に示します。

手続き:

// Setup
function showAge(person) {
    var now = new Date();
    var years = now.getFullYear() - person.born.getFullYear();
    if (person.born.getMonth() < now.getMonth()) {
        --years;
    }
    // (the calculation is not robust, it would also need to check the
    // day if the months matched -- but that's not the point of the example)
    console.log(person.name + " is " + years);
}

// Usage
var people = [
    {name: "Joe",      born: new Date(1974, 2, 3)},
    {name: "Mary",     born: new Date(1966, 5, 14)},
    {name: "Mohammed", born: new Date(1982, 11, 3)}
];
showAge(people[1]); // "Mary is 46"

これは特にオブジェクト指向ではありません。関数はshowAge、プロパティの名前を知っていると仮定して、与えられたオブジェクトに作用します。これは、s で動作する C プログラムに少し似ていstructます。

OO フォームで同じことを次に示します。

// Setup
function Person(name, born) {
    this.name = name;
    this.born = new Date(born.getTime());
}
Person.prototype.showAge = function() {
    var now = new Date();
    var years = now.getFullYear() - this.born.getFullYear();
    if (this.born.getMonth() > now.getMonth()) {
        --years;
    }
    // (the calculation is not robust, it would also need to check the
    // day if the months matched -- but that's not the point of the example)
    console.log(person.name + " is " + years);
};

// Usage
var people = [
    new Person("Joe",      new Date(1974, 2, 3)),
    new Person("Mary",     new Date(1966, 5, 14)),
    new Person("Mohammed", new Date(1982, 11, 3))
];
people[1].showAge(); // "Mary is 46"

これはよりオブジェクト指向です。データと動作の両方がPersonコンストラクター関数によって定義されます。born必要に応じて、他のコードからアクセスできないように値をカプセル化 (たとえば) することもできます。(JavaScript は、現時点では [クロージャを使用して] カプセル化に「問題ありません」。次のバージョンでは、 [ 2 つの関連する方法で] カプセル化が大幅に改善される予定です。)

于 2013-05-01T11:16:06.233 に答える
0

クラスやプロトタイプを宣言しなくても、Javascript の作業部分をコーディングすることは完全に可能です。API と DOM はオブジェクトで構成されているため、オブジェクトを使用することは間違いありません。しかし、オブジェクト指向の方法で考える必要はありません。

しかし、完全なオブジェクト指向の方法で Javascript をコーディングすることも可能です。多くのクラス/プロトタイプを作成し、ポリモーフィズムと継承を利用し、オブジェクト間で渡されるメッセージに関して動作を設計するなどです。

これが、インタビュアーがあなたから得ることを望んでいた区別だと思います.

于 2013-05-01T11:14:18.767 に答える