maisumakunさんも書かれている通り、関数の内側でプロトタイプをセットすることは出来ません。
「ある」か「ない」かで言ったらないのです。
ですがプロトタイプを設定する関数を作ることで一応まとまった書き方をすることもできます。
(求めていたものとは違うかもしれませんが……)
lang
1// 第一引数に渡された関数のprototypeに第二引数に渡されたobjectをマージする関数
2function setPrototype (fn, proto) {
3 if ("object" == typeof proto) {
4 var prototype = fn.prototype;
5 var keys = Object.keys(proto);
6 for (var i = 0, j = keys.length ; i < j ; i++) {
7 prototype[keys[i]] = proto[keys[i]];
8 }
9 }
10 return fn; // 渡された関数を返す
11}
上のような関数をを定義してから
lang
1var Person = setPrototype(function (name) {
2 this.name = name;
3}, {
4 log: function () {
5 console.log(this.name);
6 }
7});
とすればほぼ同じ物ができます。
「ほぼ」と言ったのは、
- Personという名前付き関数を定義するのではなく変数Personに無名関数を代入している点
- prototypeをオブジェクトで上書き代入するのではなく元々関数にあるprototypeにプロパティとして追加している点
が違うためです。
1)は通常は問題にならないと思います (もしこれが問題になる場面があれば教えて欲しいです)
2)についてはprototypeにオブジェクトを代入するといくつか問題がある(参考サイト)ので、こちらの方がいいかと思います。
ただ、あまり変わった書き方をするのはあまりおすすめしません。
一応こういったこともできる、というだけです。
prototypeにオブジェクトを直接代入する際に起こる問題の対応も、
lang
1function Person(name) {
2 this.name = name;
3}
4Person.prototype.log = function() {
5 console.log(this.name);
6};
普通にこうするか、
merge関数作ってやるぐらいにした方ががいいかと思います
lang
1// 第一引数に渡されたobjectに第二引数以降のobjectをマージする関数
2function merge (obj1, obj2/*, obj3, objN...*/) {
3 if ("object" == typeof obj1) {
4 for (var i = 1, j = arguments.length ; i < j ; i++) {
5 obj2 = arguments[i];
6 if ("object" != typeof obj2) continue;
7 var keys = Object.keys(obj2);
8 for (var m = 0, n = keys.length ; m < n ; m++) {
9 obj1[keys[m]] = obj2[keys[m]];
10 }
11 }
12 }
13 return obj1;
14}
15
16function Person (name) {
17 this.name = name;
18}
19merge(Person.prototype, {
20 log: function () {
21 console.log(this.name);
22 }
23});
長々と失礼しました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/30 11:25