JavaScript定義クラスの3つの方法
4985 ワード
JavaScriptはオブジェクトベースの言語です.あなたが出会ったほとんどのものは対象です.しかし、オブジェクト(OPA)に向けた言語ではなく、文法には
属性と方法を一つのオブジェクトにパッケージ化するなら、どうすればいいですか?は、インスタンスオブジェクトの元のモード を生成する.
もし人を対象としたら、名前と性別と年齢の三つの属性があります.オリジナルモードの改良 関数を使って反復性の問題を解決できます.コンストラクションモード プロトタイプオブジェクトからインスタンスを生成する問題を解決するために、JavaScriptはアーキテクチャ関数のモードを提供する.
「構造関数」とは、一般的な関数ですが、内部に構造関数の問題 コンストラクタは使いやすいですが、メモリを無駄にするという問題があります.以下の例を参照してください.
解決方法を提出します. Prottypeモード JavaScriptは、各構造関数には
これは、 Prottypeモードの検証方法 isProttypeOf() The isPrototypeOf()method checks if abject exists in another object's prototype chain. hasOwnProperty() 各インスタンスオブジェクトには、ある属性がローカル属性であるか、それとも
class
(クラス)がないからです.属性と方法を一つのオブジェクトにパッケージ化するなら、どうすればいいですか?
もし人を対象としたら、名前と性別と年齢の三つの属性があります.
let Person = {
name : '',
sex : '',
age : ''
}
実用化するには、このプロトタイプの規格に従って行う必要があります.let personA = {}; //
personA.name = "John"; //
personA.sex = "male";
personA.age = "21";
let personB = {};
personB.name = "Sara";
personB.sex = "female";
personB.age = "12";
このように、最も簡単にパッケージ化され、Personの3つの基本的な属性を一つのオブジェクトにパッケージ化します.しかし、このように書くと短所がはっきりします.1.実例と原型の間に何の連絡があるか分かりません.2.例が多ければ、書くのが大変です.function Person(name, sex, age){
return {
name : name,
sex : sex,
age : age
}
}
このようにインスタンスを生成すると、関数の呼び出しに相当する.let personA = Person("John", "male", "21");
let personB = Person("Sara","female","12");
この方法は重複性の問題を解決したが、personaとpersonBの内部的な関連は依然としてなく、それらが同じ原型オブジェクトの例であることを反映できない.「構造関数」とは、一般的な関数ですが、内部に
this
変数が採用されています.コンストラクタに対してnew
演算子を使用すると、一例が生成され、this
変数がインスタンスに結合される.function Person(name, sex, age){
this.name = name;
this.sex = sex;
this.age = age;
}
コンストラクタが作成されました.new
演算子によってインスタンスを生成できます.let personA = new Person("John", "male", "21");
let personB = new Person("Sara","female","12");
console.log(personA.name); //John
console.log(personB.age); //12
このとき、personaとpersonBは、自動的に属性constructor
を含み、それらの構造関数を指す.console.log(personA.constructor === Person); //true
console.log(personB.constructor === Person); //true
Javascriptはまた、モデルオブジェクトとインスタンスオブジェクトとの関係を検証するinstanceof
演算子を提供する.console.log(personA instanceof Person); //true
console.log(personB instanceof Person); //true
Person
オブジェクトに不変の属性type
(種類)と方法live()
(生活)を追加すると、原型オブジェクトは次のようになります.function Person(name, sex, age){
this.name = name;
this.sex = sex;
this.age = age;
this.type = " ";
this.live = function (){
console.log(" ");
}
}
同様に、上記の方法で例を生成します.let personA = new Person("John", "male", "21");
let personB = new Person("Sara","female","12");
console.log(personA.type); //
personB.live(); //
このように見えても大丈夫ですが、ここには一つの弊害があります.各新しい例において、属性type
と方法live()
は同じ内容であり、各インスタンスを生成するたびに、この2つの重複したコンテンツを生成するので、メモリを多く占用する.これは環境にもやさしいし、効率にも欠ける.解決方法を提出します.
type
属性とlive()
方法をメモリの中で一回だけ生成して、そのメモリアドレスをすべて指してもいいですか?答えは大丈夫です.prototype
属性があり、他のオブジェクトを指すと規定しています.このオブジェクトのすべての属性と方法は、構造関数の例によって継承されます.これは、
prototype
オブジェクト上にこれらの不変の属性および方法を直接定義することができることを意味する.以下のとおりですfunction Person(name, sex, age){
this.name = name;
this.sex = sex;
this.age = age;
}
Person.prototype.type = " ";
Person.prototype.live = function(){
console.log(" ");
};
この後に、例のtype
属性およびlive()
方法を生成するが、いずれも同じメモリアドレスであり、prototypeオブジェクトに向けて動作効率を向上させる.prototype
属性に合わせるために、Javascriptはいくつかの補助的な方法を定義して、それを使うのを手伝ってくれます.console.log(Person.prototype.isPrototypeOf(personA)); //true
console.log(Person.prototype.isPrototypeOf(personB)); //true
hasOwnProperty()
オブジェクトから属性を継承するかを判断するためのprototype
方法がある.console.log(personA.hasOwnProperty("name")); //true
console.log(personA.hasOwnProperty("type")); //false
in
演算子in
演算子は、ローカル属性でないにかかわらず、あるインスタンスに属性があるかどうかを判断するために使用されてもよい.console.log("name" in personA); //true
console.log("type" in personA); //true
console.log("height" in personA); //false
ソース:Javascriptオブジェクト向けプログラミング