JavaScript の継承はかなり奇妙です。インターフェイスの継承は実装できず、プロトタイプの継承にのみ依存します。
プロトタイプチェーン
プロトタイプはオブジェクトです。コンストラクターを通じて作成されたインスタンスには、プロトタイプのプロパティとメソッドを取得するためにプロトタイプを指すポインターが含まれます。このようにして、インスタンス オブジェクトはコンストラクターの属性メソッドとプロトタイプの属性メソッドを持ち、継承する必要があるコンストラクターのプロトタイプをこのインスタンスにポイントすることで、このインスタンスのすべての属性メソッドを持たせることができます。継承を達成します。
以下のデモコードを見てください:
//声明超类,通过构造函数和原型添加有关属性和方法 function Super(){ this.property = true; } Super.prototype.getSuperValue = function() { return this.property; }; //声明子类的构造函数 function SubType() { this.subproperty = false; } //将子类的原型指向超类的实例,得到超类的一切 SubType.prototype = new Super(); SubType.prototype.constructor = SubType; SubType.prototype.getSubValue = function(){ return this.subproperty; }; //由子类创建对象,测试是否继承超类方法和属性 var instance = new SubType(); console.log(instance.getSuperValue());
すべての関数のデフォルトのプロトタイプは Object のインスタンスであるため、デフォルトのプロトタイプには Object.prototype を指す内部ポインタが含まれます。
instanceof と isPrototypeOf を使用して、プロトタイプとインスタンスの間の関係を決定します。
instance instanceof Object; Object.prototype.isPrototypeOf(instance);
プロトタイプチェーンを使用する場合、メソッドを慎重に定義する必要があります。サブクラスがスーパータイプのメソッドまたは拡張機能をオーバーライドする必要がある場合、それが有効になるように、プロトタイプを置き換えるステートメントの後にサブクラスを配置する必要があります。さらに、プロトタイプ チェーンを介して継承を実装する場合、オブジェクト リテラルを使用してプロトタイプ メソッドを作成することはできません。これにより、プロトタイプ チェーンがオーバーライドされます。
...... SubType.prototype = new Super(); SubType.prototype = { .... };
プロトタイプチェーンの継承方法には主に 2 つの問題があります:
1. 参照型の値を含むプロトタイプは、すべてのインスタンスで共有されます。
前回の記事で述べたように、参照型の値を含むプロトタイプ プロパティはすべてのインスタンスで共有されるため、1 つのインスタンスが変更されると、他のインスタンスもそれに応じて変更されるため、コンストラクターでプロパティを定義する必要があります。プロトタイプ チェーンを介して継承する場合、スーパー クラスの属性がコンストラクターで定義されているかプロトタイプで定義されているかに関係なく、それらはすべてインスタンス オブジェクトになり、サブクラスによって継承されるため、サブクラスのインスタンスに影響します。
2. サブタイプのインスタンスを作成する場合、スーパータイプのコンストラクターにパラメーターを渡すことはできません。
プロトタイプ チェーンの継承により、サブクラス プロトタイプがスーパークラスのインスタンスを直接指すようになります。このとき、パラメーターをスーパークラスに渡すことができます。ただし、サブクラスがインスタンスを作成する場合、パラメーターはサブクラスのコンストラクターにのみ渡すことができ、スーパークラスのコンストラクターには渡すことができません。
したがって、実際のアプリケーションでは、プロトタイプ チェーンが単独で使用されることはほとんどありません。
関連するコーディングの実践
プロトタイプ属性を特定する
function hasPrototypeProperty(object, name) { return name in object && !object.hasOwnProperty(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 instanceof Person); // true console.log(person1.constructor === Person); // true console.log(person1.constructor === Object); // false console.log(person2 instanceof Person); // true console.log(person2.constructor === Person); // true console.log(person2.constructor === Object); // false
オブジェクトの継承
var person1 = { name: 'Nicholas', sayName: function () { console.log(this.name); } }; var person2 = Object.create(person1, { name: { configurable: true, enumerable: true, value: 'Greg', writable: true } }); person1.sayName(); // Nicholas person2.sayName(); // Greg console.log(person1.hasOwnProperty('sayName')); // true console.log(person1.isPropertyOf(person2)); // true console.log(person2.hasOwnProperty('sayName')); // false
モジュールモード
var person = (function () { var age = 25; function getAge() { return age; } function growOlder() { 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 instanceof Person); // false console.log(typeof person1); // undefined console.log(name); // Nicholas

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

WebStorm Mac版
便利なJavaScript開発ツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

ドリームウィーバー CS6
ビジュアル Web 開発ツール

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ホットトピック



