デジタル企業のアーキテクトの 1 人とのミーティングで、オブジェクト指向と非オブジェクト指向の JavaScript の違いは何かと尋ねられました。
残念ながら、私はこれに適切に答えることができず、javascript はオブジェクト指向言語のみだと思うと答えただけです。
JavaScriptのオブジェクト指向設計では、ポリモーフィズムなどの通常のoopプロシージャを使用できることを知っています。
これについてどう思いますか?そのような違いはありますか?2つを分離できますか?
デジタル企業のアーキテクトの 1 人とのミーティングで、オブジェクト指向と非オブジェクト指向の JavaScript の違いは何かと尋ねられました。
残念ながら、私はこれに適切に答えることができず、javascript はオブジェクト指向言語のみだと思うと答えただけです。
JavaScriptのオブジェクト指向設計では、ポリモーフィズムなどの通常のoopプロシージャを使用できることを知っています。
これについてどう思いますか?そのような違いはありますか?2つを分離できますか?
ほとんどのオブジェクト指向言語は、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 つの関連する方法で] カプセル化が大幅に改善される予定です。)
クラスやプロトタイプを宣言しなくても、Javascript の作業部分をコーディングすることは完全に可能です。API と DOM はオブジェクトで構成されているため、オブジェクトを使用することは間違いありません。しかし、オブジェクト指向の方法で考える必要はありません。
しかし、完全なオブジェクト指向の方法で Javascript をコーディングすることも可能です。多くのクラス/プロトタイプを作成し、ポリモーフィズムと継承を利用し、オブジェクト間で渡されるメッセージに関して動作を設計するなどです。
これが、インタビュアーがあなたから得ることを望んでいた区別だと思います.