JavaScriptオブジェクト、パッケージングクラス、プロトタイプ、プロトタイプチェーン、および呼び出し/適用に関する知識学習(3)

オブジェクト

パッケージングクラスを学習するための前提条件は、オブジェクトとその使用法を理解することに基づいている必要があります。簡単に言えば、オブジェクトにはプロパティとメソッドが含まれています。これは関数に似ていますが、インスタンスは新しいメソッドを介して作成されます。オブジェクトは次のようになります。彼のインスタンスを作成した後、インスタンスオブジェクトのプロパティとメソッドは、呼び出されたメソッドによって作成されます。

function Person() {
    
     }

var person = new Person();
person.name = "xxx";
person.work = function () {
    
    
	console.log("i am working!");
}

通常、thisキーワードを使用してオブジェクトの内部プロパティとメソッドを参照し、newキーワードを使用してコンストラクターを呼び出します。

  • 1.コンストラクターの実行のコンテキストでthis {}空のオブジェクトを暗黙的に作成します
  • 2.次に、このオブジェクトで元のオブジェクトのプロパティとメソッドを定義し、実際のパラメータを割り当てます
  • 3.最後に、このオブジェクトを暗黙的に返します。
    オブジェクトが定数を返すように記述されている場合、新規の場合は実行されませんが、この{}を暗黙的に返し続けます。
    オブジェクトに存在しないプロパティまたはメソッドにアクセスすると、エラーは報告されませんが、未定義が表示されます。
    日常のプログラム作成では、通常、**オブジェクト名= {} **の方法でオブジェクトを直接作成します。 、コードをより簡潔にするために、関連する操作を完了するのに暗黙的に役立ちます。

包装

よく知られている数値と文字列はすべて基本的な型であり、オブジェクトの機能はありませんが、いくつかのオブジェクト操作を実行しますが、結果は私たちが想像したものではありません。

var a = 10;
a.abc = "hello!";
console.log(a.abc)

aは基本タイプですが、属性を追加するためにa.abcを使用しているため、システムがエラーを報告しなかったことがわかりますが、この属性をコンソールすると、未定義が表示されます。
実際、いくつかの手順も実行しました。

  • 1. a.abcの時点で、システムはそれがオブジェクトではないことを検出し、これを実行できなかったため、を自動的にデジタルオブジェクト(パッケージングクラス)に変換しました。
  • 2次に、このオブジェクトのabc属性を定義し、定義が完了すると、このオブジェクトを自動的に破棄します。
  • 3. a.abcを再度呼び出すと、彼はaがオブジェクトではないことを発見したため、暗黙的にaを変換し、次に彼の内部のabc属性を探し、最後にこの新しいオブジェクトにこの属性がないことを発見します。未定義を返します。

同様の文字列で変数を定義しようとすると、結果は同じになりますが、これがオブジェクト文字列の元の定義であるため、** string.length()**を使用して文字列の長さを取得できるのはなぜですか。この属性なので、暗黙的な変換の後、必要な結果を得ることができます。

知識の補足

String.charCodeAt(x)
これは、オブジェクト文字列内の別のメソッドであり、文字列内の指定された文字のUnicodeコード番号を返すことができます。このメソッドを使用して、文字列が占めるバイト数を判別できます。戻り値の場合は255未満です。1つの場所を取り、その逆も同様です。

プロトタイプ

すべてのオブジェクトがインスタンス化されると、それらは関数オブジェクトに含まれる共通の親を持ち、プロトタイプもオブジェクトになります。関数オブジェクトが定義されると、暗黙的に含まれます。つまり、prototype {}、定義できます。その中のいくつかのメソッドとプロパティ、そしてインスタンス化されたオブジェクトは自動的にこれらを継承し、共有されます。

Student.prototype.name = "xxx";
function Student() {
    
    }
var student = new Student();

この定義の後、student.nameをチェックすると、「xxx」が返されますが、プロトタイプのプロパティを変更する場合は、student.name = "yyy"にしないでください。この場合、name属性が再定義されます。元のオブジェクト内で、プロトタイプのプロパティを変更する代わりに、オブジェクトとプロトタイプのプロパティの名前が同じである場合は、最も近いプリンシパルを選択して、対応する値を呼び出します。

constructor

これは、プロトタイプが確立されたときに存在するプロトタイプオブジェクトのプリミティブプロパティであり、現在のオブジェクトの構築方法を示します。手動で変更することもできます。

__プロト__

このプロパティはプロトタイプオブジェクトにも含まれています。これはJavaのsuperと同等であり、子オブジェクトと祖先を接続軸として__proto__を介して接続できるようにします。これにより、最上位のObject.prototypeまで、のプロトタイプを手動で変更できます。親、しかし、彼らはまだ最終的にトップに接続します。これはほとんどのオブジェクトのトップレベルのプロトタイプであり、ここではすべてではなくほとんどに重点が置かれていますjsにはメソッドオーバーライドもあります。toString()はObject.prototypeのメソッドですが、多くのオブジェクトでオーバーライドされています。

Object.create(プロトタイプ)

この方法は、大多数のごく一部です。

obj = {
    
    name="xxxx"}
var obj1 = Object.create(obj)

これはオブジェクトを作成する役割も果たしますが、作成時に一意のプロトタイプが割り当てられているため、オブジェクトには__proto__オブジェクトはありません。パラメータを入力する必要があります。入力しないと、構文エラーが報告されます。
BコンストラクターにAコンストラクターのプロトタイプを取得させたい場合、中間変数tempを設定して、プロトタイプがAのプロトタイプを指すようにし、次にBのプロトタイプがtempを指すようにします。これにより、継承要件が保証されるだけではありません。したがって、Bがプロトタイプ属性を変更しても、Aのプロトタイプには影響しません。

function Person() {
    
    
	name:"xxx";
}
var A={
    
    }
A.prototype = Person;
function extend(target,origin){
    
    
	var F = {
    
    }
	F.prototype = A.prototype;
	target.prototype = F;
}
extend(B,A);
var a = new A();
var b = new B();

電話/申し込み

呼び出しの機能は、これの方向を変更し、他のコンストラクターを使用して、独自のコンストラクターの実現を完了することです。

function Person(name,age) {
    
    
	this.name = name;
	this.age = age;
}
function Studetn(name.age.socer) {
    
    
	Person.call(this,name,age);
	this.socer = socer;
}
var stu = new Student("xxx",18,99);

Person.call()の役割は、この関数を呼び出すPersonと同じです。唯一の違いは、.callの最初のパラメーターで、これを変更するオブジェクトを指定する必要があることです。2番目のパラメーターは実際のパラメーターです。上記のコードは、同じ属性を持つ既存のオブジェクトのいくつかを使用して独自の属性を作成し、コードの冗長性を減らし、コードをより簡潔にするという、彼の最も一般的な方法を示しています。
applyの使用法は、渡される実際のパラメーターが次のような配列でなければならないことを除いて、callの使用法とまったく同じです。Person.call(this,[name,age]);

おすすめ

転載: blog.csdn.net/baldicoot_/article/details/106215797