JavaScriptの継承は非常に奇妙です。インターフェイスの継承を実装できず、プロトタイプの継承にのみ依存することができます。
プロトタイプチェーン
プロトタイプはオブジェクトです。コンストラクターを介して作成されたインスタンスは、プロトタイプのプロトタイプへのポインターを持ち、プロトタイプのプロパティとメソッドを取得します。このようにして、インスタンスオブジェクトには、コンストラクターの属性メソッドとプロトタイプの属性メソッドがあり、このインスタンスに継承する必要があるコンストラクターのプロトタイプを指して、インスタンスのすべての属性メソッドを継承できるように指します。
次のデモコードを参照してください。
//スーパークラスを宣言し、コンストラクターとプロトタイプを介して関連するプロパティとメソッドを追加するsuper(){this.property = true;} super.prototype.getSupervalue = function(){return this.property;};スーパークラスとすべてをスーパークラスサブタイプで取得します。プロトタイプ= new super(); subtype.prototype.constructor = subtype; subtype.prototype.getSubvalue = function(){return this.subproperty;}; console.log(instance.getSuperValue());すべての関数のデフォルトのプロトタイプはオブジェクトのインスタンスであるため、デフォルトのプロトタイプにはobject.prototypeへの内部ポインターが含まれます。
InstanceOfとIsPrototypeofを使用して、プロトタイプとインスタンスの関係を決定します。
オブジェクトのインスタンス; object.prototype.isprototypeof(instance);
プロトタイプチェーンを使用する場合、メソッドを慎重に定義する必要があります。サブクラスは、スーパータイプのメソッドまたは拡張を書き直す必要があり、プロトタイプを置き換えるステートメントの後に配置する必要があります。さらに、プロトタイプチェーンを介して継承する場合、オブジェクトリテラルを使用してプロトタイプメソッドを作成することはできません。これにより、プロトタイプチェーンがオーバーライドされます。
...... subtype.prototype = new super(); subtype.prototype = {....};これにより、新しいオブジェクトを指すポインターに取って代わり、プロトタイプチェーンを書き直します。
プロトタイプチェーンの継承方法には欠陥があり、2つの主な問題があります。
1。参照型値を含むプロトタイプから、すべてのインスタンスで共有されます。
前の記事で述べたように、参照型値を含むプロトタイプ属性はすべてのインスタンスで共有されます。 1つのインスタンスが変更され、もう1つのインスタンスがそれに応じて変更されます。したがって、属性はコンストラクターで定義する必要があります。プロトタイプチェーンが継承すると、スーパークラスの属性がコンストラクターまたはプロトタイプで定義されているかどうかに関係なく、すべてインスタンスオブジェクトになり、サブクラスによって継承されるため、サブクラスのインスタンスに影響を与えます。
2。サブタイプのインスタンスを作成する場合、パラメーターをSuperTypeコンストラクターに渡すことはできません。
プロトタイプチェーンの継承は、サブクラスのプロトタイプをスーパークラスのインスタンスに直接指しており、この時点でパラメーターをスーパークラスに渡すことができます。ただし、サブクラスがインスタンスを作成すると、パラメーターをサブクラスのコンストラクターにのみ渡すことができますが、スーパークラスのコンストラクターには渡すことはできません。
したがって、実際のアプリケーションでは、プロトタイプチェーンが単独で使用されることはめったにありません。
関連するコードプラクティス
プロトタイプ属性を特定します
関数hasprototypeproperty(object、name){object &&!object.hasownproperty(name);}のreturn nameコンストラクターにプロトタイプオブジェクトを使用します
function person(name){this.name = name;} person.prototype = {constructor:person、sayname:function(){console.log(this.name); }、toString:function(){}}; var person1 = new person( 'nicholas'); var person2 = new person( 'greg); console.log(person1 instance of person); // trueconsole.log(person1.constructor === person); // trueconsole.log(person1.constructor === person); // trueconsole.log(person1.constructor === object); // falseconsole.log(person2 instanceof person); // trueconsole.log(person2.constructor === person); // trueconsole.log(person2.constructor === object); // 間違いオブジェクト継承
var person1 = {name: 'nicholas'、sayname:function(){console.log(this.name); }}; var person2 = object.create(person1、{name:{configurable:true、eNumerable:true、value: 'greg'、wrible:true}}); person1.sayname(); // nicholasperson2.sayname(); // gregconsole.log(person1.hasownproperty( 'sayname')); // trueconsole.log(person1.ispropertyof(person2)); // trueconsole.log(person2.hasownproperty( 'sayname')); // 間違いモジュールモード
var person =(function(){var age = 25; function getage(){return age;} function grolder(){age ++;} return {name: 'nicholas'、getage:getage、growolder:growolder};}());スコープコンストラクター
function person(name){this.name = name;} person.prototype.sayname = function(){console.log(this.name);}; var person1 = person( 'nicholas'); console.log(person1 instance of person); // falseconsole.log(typeof person1); // undefinedconsole.log(name); //ニコラス