JavaScript 実装クラスと継承

高洛峰
リリース: 2016-11-26 16:16:46
オリジナル
1018 人が閲覧しました

1. はじめに

JavaScript はプロセス指向の言語だと考える人もいます。 なぜなら、基本的な使い方は基本的に関数を書いてそれを呼び出すことだからです。 ==> この考えは間違っています。

JS の創設者は、Brendan Eich です。JS が創設されたとき、Java とオブジェクト指向の設計はすでに非常に人気がありました。

1995 年 5 月、Netscape は、将来の Web スクリプト言語は「Java に十分似ている」ものの、プロ以外の Web ページ作成者でもすぐに使い始めることができるように Java よりも単純でなければならないという決定を下しました。

これを踏まえた設計思想は、

(1) C言語の基本構文から学ぶ

(2) Java言語のデータ型とメモリ管理から学ぶ

(3) Schemeから学ぶ機能を改善する言語 「一級市民」の地位へ

(4) Self 言語から学び、プロトタイプに基づく継承メカニズムを使用する。

作者自身が Java 言語に興味がないからです。つまり、JavaScript 言語は実際には、(簡略化された) 関数型プログラミング + (簡略化された) オブジェクト指向プログラミングの 2 つの言語スタイルが混合されたものです

さらに興味深いのは、作者自身がこの言語にあまり詳しくないということです ==》

「JavaScript は大好きというより嫌いと言ったほうがいいです。これは C 言語と Self 言語の一夜限りの対立の産物です。」

2. クラス ライブラリ

JS にはクラスとという概念がありません。プロトタイプを使用して継承メカニズムを実装します。

Java や C# 言語のクラス使用メカニズムに慣れているプログラマにとって、それはあまり使いやすいものではありません。

JQuery の作者である John Resig も、JS で使用できる Class と extend のライブラリを提供しています。

Class.js

[javascript]

/*

* 単純な JavaScript の継承

* John Resig 著 http://ejohn.org/

* MIT ライセンス

*

***** **************************************************

* 使用例

******************************************* **** **********

var person = Class.extend({

init: function(isDancing){

this.dancing = isDancing;

},

dance: function (){

を返す

}

ダンス ) ;

var n = new Ninja();

n.dance(); // => false

//

p 人のインスタンス && p クラスのインスタンス &&

n 忍者のインスタンス && n 人のインスタンス && n クラスのインスタンス

************************ ************************ *********

*/

// Base2 と Prototype からインスピレーションを得ました

(function(){

var fnTest = /xyz/.test(function(){xyz;}) ? /b_superb/ : /.*/;

// 基本クラスの実装 (何も行いません)

this.Class = function(){};

// このクラスを継承する新しいクラスを作成します

Class.extend = function(prop) {

var _super = this.prototype; / 基本クラスをインスタンス化します (ただし、インスタンスを作成するだけです。

// init コンストラクターは実行しません)

初期化 = true;

varprototype = new this();

// 新しいプロトタイプにプロパティをコピーします

for (var name in prop) {

// 既存の関数を上書きしているかどうかを確認します

prototype[name] = typeof prop[name] == "function" &&

typeof _super[名前] == "関数" && fnTest.test(prop[名前]) ?

,,,,,,,,,,,,,,,,,,,,, // 同じメソッドである新しい ._super() メソッドを追加します

// ただしスーパークラス

this._super = _super[name];  

// メソッドは一時的にバインドする必要があるだけなので、

// 実行が完了したら削除します

var ret = fn.apply(this, argument) ;         

this._super = tmp;  

ret を返す。  

};  

})(name, prop[name]) :

prop[name];  

}

// ダミークラスコンストラクター

function Class() {

// すべての構築は実際には init メソッドで行われます

if ( !initializing && this.init )

this.init。 apply(this, 引数);  

}

// 構築されたプロトタイプオブジェクトを設定します

Class.prototype =prototype;  

// コンストラクターが期待どおりになるように強制します

Class.prototype.constructor = Class;  

// そして、このクラスを拡張可能にします

Class.extend = argument.callee;  

クラスを返します。  

};  

})();  

3. 分析

以上のClass.jsは、その基本的な実装を実現します。JSのプロトタイプとargumnet、apply、calleeを使用して実現されます


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート