ホームページ ウェブフロントエンド jsチュートリアル JavaScript オブジェクト指向パッケージング クラスの分析 クラスパッケージング クラス library_javascript スキル

JavaScript オブジェクト指向パッケージング クラスの分析 クラスパッケージング クラス library_javascript スキル

May 16, 2016 pm 05:42 PM
class クラスライブラリ

JavaScript は、JavaScript にまったく触れたことのない技術者でも、数時間以内に簡単で役立つプログラム コードを作成できる言語です。

しかし、これから結論を言えば、JavaScript は単純な言語です。それならあなたは完全に間違っています。高性能のコードを書きたい場合は、上級プログラマーとしての基本的な資質も必要です。

Java または C プログラマーは必ずしも高パフォーマンスの JavaScript コードを作成できるとは限りませんが、高パフォーマンスの JavaScript コードを作成することは簡単です。
JavaScript のシンプルさは、その「広い心」の包括性に基づいています。宣言時に型を指定する必要はなく、任意の型に変換することもできます。オブジェクト指向ですが、クラスに制限はありません。これは自由を主張する言語であり、非常に厳格です。リベラルであれば、JavaScript を採用してください。

オブジェクト指向プログラミング (OOP) は、人気のあるプログラミング手法です。ただし、JavaScript の OOP は JAVA や C とは大きく異なり、主にその継承方法の違いを反映しています。 JavaScriptはプロトタイプPROTOTYPEをベースに継承されています。すべてのオブジェクトはプロトタイプ チェーンに基づいており、最終的には Object オブジェクトにたどり着きます。

JavaScript の継承方法と他の言語の継承方法の違いについてはあまり議論したくありません。基本的なコードをより適切に管理および維持し、重複コードを減らし、より優れたモジュール式プログラミングを実現するために、JavaScript クラスをカプセル化する方法について主に説明します。

以下は、github で見つかった優れたクラス カプセル化ライブラリの一部です:
1. MY-CLASS
プロジェクト アドレス: https://github.com/jiem/ my-class
まず基本的な使用法を見てみましょう:
a. 新しいクラスを作成します

コードをコピーします コードは次のとおりです。

(function(){
//新しいクラス
varperson=my.Class({
//静的メソッドを追加します
STATIC: {
AGE_OF_MAJORITY: 18
},
//コンストラクター
constructor:function(name,age){
this.name=name
this.age=age; >},
//インスタンス メソッド
sayHello:function(){
console.log('Hellofrom' this.name '!');
},
//インスタンス メソッド
DrinkAlcohol:function (){
this.ageconsole.log('Tooyoung!Drinkmilkinstead!'):
console.log('Whiskeyorbeer?'); }
} );
// 名前空間に公開
myLib.person=person;
varjohn=newmyLib.person('John',16); >john.sayHello ();//log"HellofromJohn!"
john. DrinkAlcohol();//log"Tooyoung!Drinkmilkinstead!"

b. 🎜>


コードをコピーします


コードは次のとおりです:
(function(){ //Dreamer は Person を継承しますvarDreamer=my.Class(person,{ //コンストラクターメソッドconstructor:function(name,age,dream){
Dreamer.Super.call(this,name,age);
this.dream=dream ;
},
//インスタンスメソッド
sayHello:function(){
superSayHello.call(this); .dream '!');
},
//インスタンスメソッド
wakeUp:function(){
console.log('Wakeup!');
}) ;
//親クラスにアクセスします
varsuperSayHello=Dreamer.Super.prototype.sayHello;
//グローバル名前空間に公開されます
myLib.Dreamer=Dreamer>})() ;
varsylvester=newmyLib.Dreamer('Sylvester',30,'eatingTweety');
sylvester.sayHello();//log"HellofromSylvester!IdreamofeatingTweety!" log"Wakeup!"


c. 新しいメソッドをクラスに追加します




コードをコピーします


コードは次のとおりです。

//新しいメソッドを myLib.Dreamer に追加します
my.extendClass(myLib.Dreamer,{
//静的メソッドを追加しますSTATIC:{ s_dongSomeThing:function(){ console.log("dosomething!"); } }, //インスタンスメソッドを追加
touchTheSky:function(){
console.log('Touchingthesky');
} ,
// インスタンスメソッドを追加
reachTheStars:function(){
console.log('Sheissopretty!'); >});


d. クラスメソッドを実装します




コードをコピーします


以下:

//新しいクラスを宣言します
myLib.ImaginaryTraveler=my.Class({
travel:function(){console.log('Travelingonacarpet!');},
crossOceans: function(){console.log('SayinghitoMobyDick!');}
});
(function(){
//Dreamer は ImaginaryTraveler の実装メソッドを継承します
varDreamer=my.Class( Person,ImaginaryTraveler,{
//コンストラクターメソッド
constructor:function(name,age,dream){
Dreamer.Super.call(this,name,age)
this.dream=dream; ;
}
})
//グローバル名前空間に公開
myLib.Dreamer=Dreamer>)(); =newDreamer('Aladdin');
aladdininstanceofImaginaryTraveler;//false
aladdin.wakeUp();
aladdin.sayHello(); ;


新しい演算子を忘れるのが怖い場合



コードをコピーします
コードは次のとおりです varperson=my.Class({ //新しい コンストラクターの有無にかかわらず、コンストラクターを呼び出すことができます:function(name,city){
if(!(thisinstanceofPerson))
returnnewperson (name,city);
this.name=name;
}
ソースを見てみましょうmy.class のコード分析:
my.Class の実装アイデアは基本的に次のようになります。パラメーターが 1 つしかない場合、このパラメーターはメソッド、プロパティ、コンストラクターを宣言するために使用されます。新しいクラスの。継承はされませんが、継承することは可能です。

継承の考え方は、パラメーターが 2 つある場合、最初のパラメーターは親クラスとして継承され、2 番目のパラメーターは新しいクラスのメソッド、属性、コンストラクターを宣言するために使用されます。継承することもできます。

継承された親クラスとしての最初のパラメーターを除き、パラメーターが 3 つ以上ある場合、最後のパラメーターは新しいクラスのメソッド、属性、およびコンストラクターを宣言するために使用されます。中央のパラメータは、クラスを使用して新しいクラスを拡張するメソッドです。もちろん、my.extendClass を通じて新しいメソッドを拡張することもできます。
同時に、クラス ライブラリは commonJS とブラウジング環境の両方のサポートを提供します。



コードをコピー


コードは次のとおりです:

/*globalsdefine:true,window:true,module:true*/
(function(){
//Namespaceobject
varmy={};
//AMD を保証サブモジュールが利用可能です
if(typeofdefine!=='unknown')
define([],function(){
returnmy;
});
elseif(typeofwindow!==) 'unknown ')
//クライアントが利用可能であることを確認します
window.my=my;
else
//バックグラウンドが利用可能であることを確認します
module.exports=my; >//==== ========================================== ======= ======================
//@methodmy.Class
//@paramsbody:Object
//@paramsSuperClass:function, ImplementClasses:function...,body:Object
//@returnfunction
my.Class=function(){
varlen=arguments.length
varbody=arguments; [len-1];/ /最後のパラメータは、それ自体を指定するメソッドです
varSuperClass=len>1?arguments[0]:null;//最初のパラメータは、インスタンスと静的メソッドの両方の継承されたメソッドを参照します一部は継承されます
varhasImplementClasses=len> 2;//3 番目のパラメータがある場合、2 番目のパラメータは実際にはインスタンス オブジェクトのみを継承します
varClass, SuperClassEmpty>//保証されたコンストラクタ メソッドです。
if(body.constructor=== Object){
Class=function(){};
}else{
Class=body.constructor; // コンストラクターが後で上書きされません
deletebody.constructor;
}
//スーパークラス部分の処理
if(SuperClass){
//ミドルウェアはインスタンス属性の継承を実装します
SuperClassEmpty=function() {};
SuperClassEmpty.prototype=SuperClass.prototype;
Class.prototype=newSuperClassEmpty();//プロトタイプの継承、逆参照
Class.prototype.constructor=Class;//保証されたコンストラクター
.Super=SuperClass;//親オブジェクト アクセス インターフェイス
//静的メソッドの継承、スーパークラス メソッドのオーバーロード
extend(Class,SuperClass,false);
}
//ImplementClass 部分の処理、実際には、SuperClass#arguments[0] #And body#arguments[length-1]#
if(hasImplementClasses)
for(vari=1;i//implement は継承されたインスタンス属性部分で、オーバーロードされた親オブジェクトのimplementClassメソッド
extend(Class.prototype,arguments[i].prototype,false);
//処理自体が本体部分を宣言します。 、静的部分は STATIC を指定する必要があり、インスタンス部分は STATIC 部分を削除する必要があります
extendClass(Class,body)
}; ========================= ======================== =====================
/ /@methodmy.extendClass
//@paramsClass:function,extension:Object,?override:boolean=true
varextendClass=my.extendClass=function(Class,extension,override){
//静的部分 静的部分を継承
if(extension.STATIC){
extend(Class,extension.STATIC, override);
//インスタンス部分が静的メソッドを継承しないことを保証します
deleteextension.STATIC;
}
//インスタンス属性はインスタンス部分から継承されます
extend(Class.プロトタイプ、拡張機能、オーバーライド);
//================ ================ ================================= ===========
varextend=function (obj,extension,override){
varprop;
//実際、ここのフラグは親オブジェクトをオーバーライドするメソッドを示します
if(override===false){
for(propinextension )
if(!(propinobj))
obj[prop]=extension[prop];
}else{
// 実際には、親オブジェクトのメソッドはここではカバーされていません。 toString
for(propinextension)
obj[prop]=extension[prop];
if(extension.toString!==Object.prototype.toString)
obj.toString=extension.toString; 🎜>}
};
})();



プロジェクトアドレス: https://github.com/ded/ klass
まず使用方法を見てみましょう:
a. 新しいクラスを作成します


コードをコピーします



//クラスを宣言します varPersonal=klass(function(name){ this.name=name }) .statics ({ //静的メソッドhead:':)', feet:'_|_'
})
.methods({//インスタンス メソッド
walk:function() {}
})


b. クラスを継承します




コードをコピーします

コードは次のとおりです:

//SuperHuman は Person を継承します varSuperHuman=Person.extend(function(name){ //親クラスのコンストラクターを自動的に呼び出します }) .methods ({ walk:function(){ //親クラスの walk メソッドを呼び出すことを明示的に宣言
this.supr()
this.fly()
},
fly :function(){}
})
newSuperHuman('Zelda').walk()


c、リテラル モードでクラスを宣言




コードをコピーします

コードは次のとおりです:

varFoo=klass({ foo:0, initialize :function(){ this.foo=1 }, getFoo:function(){ returnthis.foo
},
setFoo:function(x){
this.foo= x
returnthis.getFoo()
}
})


d. クラス メソッドを実装します
場合によっては、インスタンス メソッドをオーバーライドしたり、混合したりすることができます。
コードをコピーします コードは次のとおりです:

//継承するリテラルを渡すことができます
varAlien=SuperHuman.extend({
beam:function(){
this .supr()
//beamintospace
}
})
varSpazoid=newAlien('Zoopo')
if(beamIsDown){
//ビームメソッドをオーバーライド
Spazoid.implement({
beam:function(){
this.supr()
//fallbacktojets
this.jets()
}
})


klass のソース コード分析を見てみましょう:
klass の基本的な設計思想は非常に明確であり、継承を模倣するよう最善を尽くしています。他の言語のメソッド。たとえば、サブクラスのコンストラクターは親クラスのコンストラクターを呼び出しますが、親クラスのメソッドを呼び出すように明示的に宣言することもできます。

この種の判断は通常のマッチングに基づいています: fnTest=/xyz/.test(function(){xyz;})?/bsuprb/:/.*/; キーワード "super"
If親クラスのメソッドを呼び出すことが明示的に宣言され、メソッドが宣言されると、内部で親クラスのメソッドを呼び出し、同じ値を現在のクラスのメソッドに返す関数にパッケージ化されます。

一方で、工法も比較的柔軟です。 initialize が明示的に宣言されている場合、これがコンストラクターになります。それ以外の場合、パラメーターが関数の場合はそれがコンストラクターとして使用され、それ以外の場合は親クラスのコンストラクターが使用されます。

静的メソッドを使用して静的メソッドを追加し、インスタンスの実装と静的メソッド メソッドを使用してインスタンス メソッドを追加します。
継承は親クラスの拡張によって実現されます。
同時に、クラス ライブラリは commonJS とブラウジング環境の両方のサポートを提供します。
コードをコピー コードは次のとおりです:

/**
*Klass.js-copyright@dedfat *バージョン 1.0
*https://github.com/ded/klass
*Followoursoftwarehttp://twitter.com/dedfat:)
*MITLicense
*/
!function(context,f){
//fnTest は、スーパー親クラスのメソッドの呼び出し方法を確認できるかどうかを検証するために使用されます。正規表現による
varfnTest=/xyz/.test(function(){xyz;})?/bsuprb/:/.*/、
noop=function(){}、
proto='prototype ',
isFn =function(o){
returntypeofo===f;
//基本クラス
functionklass(o){
returnextend.call(typeofo=) =f?o:noop ,o,1);
}
//同じ名前のスーパー メソッドを借用する関数にラップします
functionwrap(k,fn,supr){
returnfunction(){
//元の this.super をキャッシュします
vartmp=this.supr;
//上の super から同じ名前のメソッドを借用するように this.super を一時的に変更します
// o (fnTest.text(fn)= =true) に明示的なステートメントを指定します。同じ名前のスーパー メソッドを借用するには、
this.supr=supr[proto][k] を使用します。
//実行を借用します。戻り値を保存します
varret=fn.apply(this,arguments);
//元の this.super
this.supr=tmp
//確実に戻り値を返します。ラップ後の戻り値が元の
} と一致していること
}
// o と super が同じ名前のメソッドを持ち、 o が次のメソッドを借用することを明示的に宣言している場合。 super からの同じ名前を使用するために実行される関数にラップします
// super から同じ名前のメソッドを借用する明示的な宣言がない場合、またはそれが o の一意のメソッドである場合、またははメソッドではありません。
functionprocess(what,o,supr){
for(varkino){
// 非継承メソッドの場合は、メソッド アノテーション ルールに従って実行します。最後に what
if(o.hasOwnProperty(k)){
what[k]=typeofo[k]==f
&&typeofsupr[proto][k]==f
&&fnTest に入れます。 test(o[k])
?wrap(k,o[k],supr):o[k];
}
}
}
// 継承メソッドの実装、fromSub上記の klass では、fromSub が 1 であり、コンストラクターは
functionextend(o, fromSub){
//noop を実行するために super を使用しません。メディア クラスはプロトタイプの継承の逆参照を実装します
noop[proto]=this[proto]
varsupr=this,
prototype=newnoop(),//プロトタイプの継承、逆参照用のインスタンス オブジェクトを作成します
isFunction=typeofo==f,
_constructor=isFunction?o:this,// o が構築メソッドの場合はそれを使用し、そうでない場合はコンストラクターを決定します
_methods=isFunction?{}:o, //If o は {...} であり、fn プロトタイプに含めるにはメソッドを使用する必要があります。その中に初期化がある場合、それはコンストラクターです。o が関数である場合、それは上記の _constructor によって決まります。 constructor
fn=function() {//kclass は kclass に依存しているため、実際に最終的に返されるのは fn であり、実際には新しいクラスのコンストラクターです
//1 If o が {... o のプロトタイプで、o に初期化がある場合、fn のプロトタイプに初期化がある場合、それはコンストラクター メソッドです。
//2 If oは関数です。メソッドは fn のプロトタイプに何も追加できませんが、_constructor は o をコンストラクターとして受け入れます
//3 o が {....} で、その中に初期化がない場合、これがコンストラクターですklass の呼び出しによって決定される場合、コンストラクターは明らかに noop です。非基底クラスの場合、コンストラクターは親クラスのコンストラクターです。
//o は関数ではないため、親のコンストラクターです。 class は自動的には呼び出されませんが、親クラスのコンストラクターは現在のクラスのコンストラクターとみなされます ----this すべては、この
console.log(this)> のポイントによって決まります。 if(this.initialize){
this.initialize.apply(this,arguments);
}else{
//親クラスのコンストラクターを呼び出します
//上の 3 に示すように、o は関数ではないため、親クラスのコンストラクターは呼び出されません
//基本クラスには親クラスがなく、親クラスのコンストラクターは Sub |
_constructor から呼び出されません。 .apply(this,arguments);
}
}
// プロトタイプ メソッド インターフェイスを構築します
fn.methods=function(o){
process(prototype,o,supr);
fn[proto]=prototype;
returnthis;
}
// 新しいクラスのコンストラクターを実行します
fn .methods.call(fn) ,_methods).prototype.constructor=fn;
//新しいクラスが継承できることを確認します
fn.extend=arguments.callee
//インスタンス メソッドまたは静的メソッドを追加します、statics: static メソッド、インスタンスメソッドを実装します
fn[proto].implement=fn.statics=function(o,optFn){
//o が文字列である場合、メソッドを追加するときは o がオブジェクトであることを保証します。 、 o がオブジェクトの場合、バッチで追加されることを意味します
//o からコピーする必要があるため
o=typeofo=='string'?(function(){
varobj= { };
obj[o]=optFn;
returnobj;
}()):o
// インスタンス メソッドまたは静的メソッドを追加、インスタンス メソッドを実装します。 process(this,o,supr);
returnthis;
}
//バックエンドの使用、nodejs
if(typeofmodule!=='unknown' &&module) .exports){
module.exports=klass;
}else{
varold=context.klass;
//アンチコンフリクト
klass.noConflict=function(){
context.klass=old;
returnthis;
//フロントエンドブラウザの場合
context.klass=kclass;
}(this,'関数')

;
3. 간단한 구현도 있습니다
구현 아이디어는 매우 간단합니다. 즉, ECMAScript5 프로토타입을 사용하여 Object.create 메서드를 상속하고 이를 메서드로 캡슐화하는 것입니다. ECMAScript5 환경은 지원하지 않으므로 번역되어 성능이 저하됩니다.
에 가서 코드를 복사하세요. 코드는 다음과 같습니다. 🎜>
functionF(){};
F.prototype=superCtor.prototype;
ctor.prototype=newF()
ctor.prototype.constructor=ctor;

마지막 매개변수가 현재 클래스의 메서드 선언이라는 점을 제외하면 다른 매개변수는 상위 클래스에서 상속되어 순환 상속이 필요하지만 여기에서의 처리는 비교적 간단하고 덮어쓰기가 포함되지 않습니다. 직접 추가할 수 있습니다.


varClass=(function(){
/* *
*함수 상속.(node.js)
*
*@paramctorsubclass'sconstructor.
*@paramsuperctorsuperclass의 생성자.
*/
varinherits=function(ctor,superCtor){
//부모 클래스를 명시적으로 지정
ctor.super_=superCtor;
//ECMAScript5 프로토타입 상속 및 역참조
if(Object.create){
ctor.prototype=Object.create(superCtor.prototype,{
생성자:{
값:ctor,
열거 가능:false,
쓰기 가능 :true,
configurable:true
}
});
}else{
//Object.create 메서드 없이 원활한 성능 저하
functionF(){}; .prototype=superCtor.prototype;
ctor.prototype=newF();
ctor.prototype.constructor=ctor;
}
}; 🎜>returnfunction(){
//마지막 매개변수는 새 클래스 메서드, 속성 및 생성자 선언입니다.
varsubClazz=arguments[arguments.length-1]||function(){}; 초기화는 생성자이고 그렇지 않으면 생성자는 빈 함수입니다.
varfn=subClazz.initialize==null?function(){}:subClazz.initialize;
//마지막 매개변수를 제외하고 클래스를 상속하면 더 많은 상속이 가능합니다. 확장 메서드로도 사용 가능
for(varindex=0;indexinherits(fn,arguments[index])
}
// 메서드 새로운 클래스 구현
for(varpropinsubClazz){
if(prop=="initialize"){
continue;
}
fn.prototype[prop]=subClazz[prop]
}
returnfn;
}
})()


다음 예를 참조하세요.




복사 코드

코드는 다음과 같습니다.
/***클래스 함수. */ varCat=Class({ /***Cat 클래스의 정의.
*/
initialize:function(name){
this.name=name
},
/**
*건축자.
*
*@paramname고양이 이름
*/
eat:function(){
alert (this. name "iseatingfish.");
}
})
/**
*먹기 기능.
*/
varBlackCat=Class(Cat,{
/**
*BlackCat 클래스의 정의.
*/
initialize:function(name,age){
//calltheconstructorofsuperclass.
BlackCat.super_.call(this,name)
this.age=age
} 🎜>/ **
*건축자.
*
*@paramname고양이 이름.
*@paramageCat'sage.
*/
eat:function(){
alert(this.name "(" this.age ")iseatingdog.")
}
});
/**
*먹기 기능.
*/
varBlackFatCat=Class(BlackCat,{
/**
*BlackFatCat 클래스의 정의입니다.
*@paramweightCat'sweight.
*/
초기화:함수(이름, age,weight ){
//calltheconstructorofsuperclass.
BlackFatCat.super_.call(this,name,age)
this.weight=weight;
/**
*건축자.
*
*@paramname고양이 이름.
*@paramageCat'sage.
*@paramweightCat의 체중입니다.
*/
eat:function(){
alert(this.name "(" this.age ")iseatingdog.Myweight:" this.weight)
}
}); >/* *
*먹기 기능.
*/
varDog=Class({});
varcat=newBlackFatCat("John",24,"100kg")
cat.eat(); //true
alert(catinstanceofCat);
//true
alert(catinstanceofBlackCat);//true
alert(catinstanceofBlackFatCat)
//true
alert( cat.constructor ===BlackFatCat);
//false
alert(catinstanceofDog);



mootools 클래스의 소스 코드 분석 라이브러리는 여기에서 볼 수 있습니다: http://www.cnblogs.com/hmking/archive/2011/09/30/2196504.html
구체적인 사용법 보기:
a 새 클래스 만들기




코드 복사

코드는 다음과 같습니다.
varCat=newClass({
initialize:function(name ){
this.name=name ;
}
})
varmyCat=newCat('Micia') alert(myCat.name);//alerts'Micia' varCow=newClass({ 초기화:function(){ alert('moooo'); } });
b. 継承の実装
コードをコピーします コードは次のとおりです:

varAnimal =newClass( {
initialize:function(age){
this.age=age;
}
});
varCat=newClass({
Extends:Animal, initialize: function(name,age){
this.parent(age);//callsinitalizemethodofAnimalclass
}
});ミシア'、20);
alert(myCat.name);//alerts'Micia'。


c.拡張クラス



コードをコピー
コードは次のとおりです。 varAnimal=newClass({ initialize:function(age ){
this.age=age;
}
});
varCat=newClass({
Implements:Animal,
setName:function(name) ){
this .name=name
}
});
varmyAnimal=newCat(20);
myAnimal.setName('Micia'); );//alerts' Micia'.



5. JavaScript の理解: 構文 Nectar

まず使用例を見てください
a.

コードをコピー

コードは次のとおりです: //クラス Person を作成します varPerson=Class(オブジェクト,{ Create:function( name,age){ this.name=name;
this.age=age;
},
SayHello:function(){
alert("こんにちは、私は「この .name "、" this.age "年です。")
}
}); );
BillGates.SayHello() ;


継承クラス




コードをコピーします。コードは次のとおりです。


//従業員は Person を継承します
varEmployee=Class(Person,{ Create:function(name,age,salary){ person.Create .call(this,name,age); // 基本クラスのコンストラクターを呼び出します this.salary=salary }, ShowMeTheMoney:function(){
alert( this.name "$" this.salary);
}
});
varSteveJobs=New(従業員,["SteveJobs",53,1234]);
SteveJobs.ShowMeTheMoney();


以下はソース コード分析です: 明らかに、追加の New メソッドがあり、クラスと新しいクラスのインスタンスの作成は巧妙にカプセル化されています。意味のある全体を形成します!もう 1 つの違いは、すべてのクラスが関数ではなくリテラルに基づいていることです。コードは非常に短いですが、原理は豊富で賢明なので、じっくり味わうことができます。




コードをコピー


コードは次のとおりです:

//クラスを作成する関数。使用されます。クラスと継承関係を宣言します
functionClass(aBaseClass,aClassDefine){
// クラスの一時関数シェルを作成します functionclass_(){ this.Type=aBaseClass>/ /各クラスに、その継承クラスを参照する規則 A Type 属性を与えます。 for(varmemberinaClassDefine) this[member]=aClassDefine[member] //クラスのすべての定義を現在作成されているクラスにコピーします。 class };
class_.prototype=aBaseClass;
returnnewclass_()
};
// オブジェクトを作成する関数
functionNew(aClass) ,aParams){
// オブジェクトの一時的な関数シェルを作成します
functionnew_(){
this.Type=aClass;
// また、以下に基づいて各オブジェクトに Type 属性を割り当てます。これにより、オブジェクトが属するクラスにアクセスできます。
if(aClass.Create)
aClass.Create.apply(this, aParams);
//すべてのクラスのコンストラクターが Create と呼ばれることに同意します。これは DELPHI
};
new_.prototype=aClass;
returnnewnew_()
}; に似ています。解析されていない箇所が多く、不正確な箇所があるかもしれませんので、修正してください。
上記の分析を読んだ後、その情報に従って独自のカプセル化クラス ライブラリを作成することもできます。実装方法については、個人の好みによって異なります。ただし、基本的な考え方は同じプロトタイプベースの継承方法と新しい循環コピー方法です。

原文: Mu Yi http://www.cnblogs.com/pigtail/
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python でクラスとメソッドを使用する方法 Python でクラスとメソッドを使用する方法 Apr 21, 2023 pm 02:28 PM

クラスとメソッドの概念とインスタンス クラス (Class): 同じプロパティとメソッドを持つオブジェクトのコレクションを記述するために使用されます。コレクション内のすべてのオブジェクトに共通のプロパティとメソッドを定義します。オブジェクトはクラスのインスタンスです。メソッド: クラスで定義された関数。クラス構築メソッド __init__(): クラスには init() という名前の特別なメソッド (構築メソッド) があり、クラスがインスタンス化されるときに自動的に呼び出されます。インスタンス変数: クラスの宣言において、属性を変数で表現したものをインスタンス変数と呼びます。インスタンス変数とは、self で修飾された変数です。インスタンス化: クラスのインスタンス、クラスの特定のオブジェクトを作成します。継承: つまり、派生クラス (派生クラス) は基本クラス (ベースクラス) を継承します。

jQueryを使用して要素のクラス名を置換する jQueryを使用して要素のクラス名を置換する Feb 24, 2024 pm 11:03 PM

jQuery は、Web 開発で広く使用されている古典的な JavaScript ライブラリで、イベントの処理、DOM 要素の操作、Web ページ上でのアニメーションの実行などの操作を簡素化します。 jQueryを使っていると要素のクラス名を置き換える場面がよくありますが、この記事ではその実践的な方法と具体的なコード例を紹介します。 1.removeClass() メソッドと addClass() メソッドを使用する jQuery には、削除用の RemoveClass() メソッドが用意されています。

Pythonにおけるクラスとは何を意味するのでしょうか? Pythonにおけるクラスとは何を意味するのでしょうか? May 21, 2019 pm 05:10 PM

クラスとはPythonでクラスを定義するためのキーワードです クラスの定義方法:classの後ろにスペースを入れてからクラス名を追加します; クラス名のルール:最初の文字を大文字にします 複数の単語がある場合はキャメルケースを使用してください[class Dog()] などの名前付け。

SpringBoot がカスタム クラスローダーを通じてクラス ファイルを暗号化および保護する方法 SpringBoot がカスタム クラスローダーを通じてクラス ファイルを暗号化および保護する方法 May 11, 2023 pm 09:07 PM

背景 最近、jd-gui などの逆コンパイル ツールによってエンジニアリング コードが簡単に復元されないようにするために、企業のフレームワークでは主要なビジネス コードが暗号化されていますが、関連する難読化スキームの構成と使用は比較的複雑であり、多くの問題が発生しています。 springboot プロジェクトなので、クラス ファイルが暗号化されて渡されます。カスタム クラスローダが復号化されてロードされます。このソリューションは絶対に安全というわけではありません。逆コンパイルの難易度が上がるだけです。紳士は阻止できますが、悪党は阻止できません。全体的な暗号化保護のフローチャートが示されています。 Maven プラグインの暗号化では、カスタム Maven プラグインを使用してコンパイルします。指定されたクラス ファイルが暗号化され、暗号化されたクラス ファイルが指定されたパスにコピーされます。ここでは、resource/corecla に保存されます。

PHP クラスの使用法の詳細な説明: コードをより明確で読みやすくします。 PHP クラスの使用法の詳細な説明: コードをより明確で読みやすくします。 Mar 10, 2024 pm 12:03 PM

PHP コードを記述するとき、クラスを使用するのは非常に一般的な方法です。クラスを使用すると、関連する関数とデータを 1 つのユニットにカプセル化できるため、コードがより明確になり、読みやすく、保守しやすくなります。この記事では、PHPClass の使用法を詳しく紹介し、クラスを適用して実際のプロジェクトでコードを最適化する方法を読者がよりよく理解できるように、具体的なコード例を示します。 1. クラスの作成と使用 PHP では、キーワード class を使用してクラスを定義し、クラス内のプロパティとメソッドを定義できます。

Javaの事前定義されたClassオブジェクトのメソッド Javaの事前定義されたClassオブジェクトのメソッド Jul 01, 2023 pm 06:41 PM

基本的な Java 型 (boolean、byte、char、short、int、long、float、double) とキーワード void も、class 属性を通じて Class オブジェクトとして表されます。Class クラスの booleanisPrimitive() は、指定された Class オブジェクトが表すかどうかを決定します。基本的なタイプ。ラッパー クラスおよび Void クラスの静的 TYPE フィールド; Integer.TYPE==int.class;Integer.class==int.class; 配列型のクラス インスタンス オブジェクト: Classclz=String[].class; 配列のクラス

Vue エラー: v-bind を使用してクラスとスタイルを正しくバインドできません。解決方法は? Vue エラー: v-bind を使用してクラスとスタイルを正しくバインドできません。解決方法は? Aug 26, 2023 pm 10:58 PM

Vue エラー: v-bind を使用してクラスとスタイルを正しくバインドできません。解決方法は? Vue 開発では、v-bind 命令を使用してクラスとスタイルを動的にバインドすることがよくありますが、v-bind を正しく使用してクラスとスタイルをバインドできないなどの問題が発生することがあります。この記事では、この問題の原因と解決策を説明します。まず、v-bind ディレクティブを理解しましょう。 v-bind は V をバインドするために使用されます

jqueryで要素にクラスがあるかどうかを確認する方法 jqueryで要素にクラスがあるかどうかを確認する方法 Mar 21, 2023 am 10:47 AM

jquery が要素にクラスがあるかどうかを判断する方法: 1. 「hasClass('classname')」メソッドを通じて要素に特定のクラスがあるかどうかを判断します; 2. 「is('.classname」を通じて要素に特定のクラスがあるかどうかを判断します。 ')" 方法。

See all articles