Self
実行時環境は選択的に呼び出し構造を平坦化することで性能向上を図っている。そのためには、型情報や異なる型に応じた複数の実行コードをキャッシュしておく必要があるが、時間の掛かるメソッド探索の回数を減らしたり、メソッド探索を条件分岐やハードコードされた呼出しで置き換えたりすることができる。これにより言語としての一般性を保ち、ガベージコレクションを備えつつ、C言語に近い性能が達成されているのである。
システムがある程度まで成長すると、全体として硬直化が起きて、特に基本的なクラス群は相互の関連に縛られ、機能追加が困難となる。
Smalltalk のような動的言語では、クラスの変更によって容易にオブジェクトの振る舞いを変えられるという特徴でこれに対処できる。しかし、このような変更は注意深く行われるべきである。さもなくば、変更されたクラスに所属する、挙動が変更されるべきでないオブジェクトは「誤った」挙動を示してしまう。この問題は脆弱な基底クラス問題の一つである。一方で、C++のように、基底クラスと派生クラスを別々にコンパイルできる言語では、事前にコンパイルした派生クラスのメソッドに、基底クラスでの変更が派生しない。この問題は脆弱な基底クラス問題のもう一つの形式であり、脆弱なバイナリ・インターフェース問題の一つでもある。
Self や他のプロトタイプベース言語では、クラスとオブジェクトの双対関係が排除されている。
何らかの「クラス」に基づくオブジェクトの「インスタンス」を作るのではなく、Self では既存のオブジェクトをコピーし、それに修正を加える。従って、Porsche 911 を作るには、他の Vehicle オブジェクトをコピーし、「高速運転」メソッドを追加すればよい。コピー元となるオブジェクトを「プロトタイプ」と呼ぶ。この技法によりダイナミズムが劇的に単純化されると言われている。既存のオブジェクトがモデルとして不適切であった場合、プログラマは単にオブジェクトに修正を加えて正しい振る舞いをするようにして、それを新たなプロトタイプとして使えばよい。既存のオブジェクトを使っているコードはそのまま使うことができる。