コンストラクターとして呼び出される関数は、デフォルトでプレーンオブジェクトを返します。他のタイプのオブジェクトを返すようにすることはできますが、そのオブジェクトはコンストラクターのプロトタイプから継承されません。[[Prototype]]
また、関数オブジェクトのを変更することはできません(非推奨のprotoプロパティを無視します)。
コンストラクター(関数)とコンストラクターによって作成されたオブジェクトが同じメソッドを持つことができる唯一の方法は、両方が[[Prototype]]
チェーン内のオブジェクトを共有することです。これは、Object.prototypeを拡張することによってのみ実行できます。これは、関数とオブジェクトの両方が共有できる唯一のオブジェクトだからです。
また、オブジェクトのパブリックメソッドへのアクセスを防ぐことはできません。プライベートメンバーをエミュレートすることはできますが、それはかなり弱いエミュレーションです。ただし、呼び出し元のオブジェクトが特定の「クラス」のインスタンスであることをメソッドでチェックすることができます。
function Foo(){}
Foo.prototype.bar = function() {
return this instanceof Foo? 'success' : 'failure';
}
var foo = new Foo();
var blah = {};
// Call bar method of an instance of Foo
alert(foo.bar()); // success
// Call bar method on some other object
alert(Foo.prototype.bar.call(blah)); // failure
javascriptのそのようなソリューションは簡単になりすまし、堅牢な方法でやりたいことを行うことは不可能です。