2017-01-23 4 views
1

最初に、私はこれがほとんどの実用的なJSアプリケーションではあまりお勧めできないと理解します。私はDSLを構築しており、JavaScriptの限界をテストしています(proxiesreflectionのような新機能で拡大しているようです)。 var a = function(){}しかし、いくつかのクレイジーな理由で、私は本当には、いくつかの任意のデータ(a.prototype = "blah")を格納するためにaprototypeプロパティを使用したいJavaScript関数の `prototype`プロパティの名前を変更することはできますか?

は、私は新しい関数を作成するとします。だから、それを上書きするのは簡単だ

configurable: false 
enumerable: false 
writable: true 

が、それは、関数の機能を台無しよ:

Function.prototypeproperty descriptorはこれです。 new a()を呼び出すと、そのように動作しません。理想的には、それを__prototypeなどの名前に変更し、新しいインスタンスを作成するときにコンストラクタがprototypeではなくそのプロパティを参照するようにする方法があります。

これは不可能だと私は疑いますが、ES6がこれを実行可能にするもの(代理人)を追加したかどうかはわかりませんか?フードの下で何が起こっているのかを理解しているJavaScriptプロフェッショナルがこれを手助けすることができれば素晴らしいだろう。

P.S. argumentsconfigurableまたはwritableではないため、Function.argumentsと同じことをやりたいのですが、それは別の質問かもしれません。そこにコメントがありますか?

+0

ES標準では*ハードコード化されていると思います。 http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-prototype。 – Andrey

+0

'Object.create'を使ってプロトタイプを' __prototype'プロパティに設定したオブジェクトを作成する独自のcreate関数を作ることができますが、デフォルト* new *は常にコンストラクタで '.prototype'を探します – Andrey

+0

ヒント! – JoeRocc

答えて

3

JavaScript関数のprototypeプロパティの名前を変更することはできますか?あなたが意味する場合

、それはそれはあなたがnew aを使用する場合a.prototypeではなく、新しいオブジェクトのプロトタイプを割り当てるために、異なるプロパティを使用するようにnewオペレータの振る舞いを更新することが可能である、いや、そうではありません。しかし、あなたはa(例えば、pa)のプロキシを作成して、new paが新しいオブジェクトに異なるプロトタイプを設定するということは間違いありません。

例(これはコンストラクタ関数であるので、私はAPAを使用しました)、コメントを参照してください。

// Our original constructor 
 
function A(name) { 
 
    this.name = name; 
 
} 
 
// A different property to use as a prototype 
 
A.objectPrototype = { 
 
    sayName() { 
 
    console.log(`My name is ${this.name}`); 
 
    } 
 
}; 
 
// Make the prototype property something else entirely 
 
A.prototype = 42; 
 

 
// Construct our proxy 
 
const PA = new Proxy(A, { 
 
    construct(target, args, newTarget) { 
 
    let o = Reflect.construct(target, args, newTarget); 
 
    // Replace the object's prototype 
 
    Object.setPrototypeOf(o, A.objectPrototype); 
 
    return o; 
 
    } 
 
}); 
 

 
// Demonstrate that the new object gets its prototype from our custom prop 
 
const o = new PA("foo"); 
 
o.sayName();

new Aはまだそれをしないだろう、とPAはしません継承で正常に再生すると、私は強くお勧めします、しかし、ええ、プロキシは強力です。 :-)

これで上書きするのは簡単ですが、機能の機能が混乱します。

new演算子で関数を使用する場合のみ。そうでない場合は、prototypeプロパティで何でもできます。何も使用しないためです。(I ではありませんが、可能です。)

+0

ありがとう、TJ!私は速い反応を感謝しました - いつものように非常に徹底して役立ちます。 – JoeRocc

関連する問題