質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1578閲覧

Object.definePropertiesでクラス名に定義されたpropertyを自動で設定したい

退会済みユーザー

退会済みユーザー

総合スコア0

CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/10/05 05:45

編集2016/10/05 07:39

お世話になっております。

javascript

1function A(a,b,c){ 2 this.a = a; 3 this.b = b; 4 this.c = c; 5} 6 7A.prototype.someAction = function(){ 8 return; 9} 10 11function B(){ 12 this.attr = new A(1,1,1); 13} 14

という関係があり,これを

javascript

1b = new B(); 2a = new A(2,3,4); 3b.instance_a = a

などとしてObjectを渡すのではなく,

javascript

1Object.defineProperties(B.prototype, 2 {instance_a:{set:function(value){this.instance_a.a = value.a}} 3}) 4b.instance_a = a;

としてプロパティに設定したクラスのそれぞれのpropertyに参照渡しではなく
コピー代入でアクセスできるようにしたいです。

上記のコードでは一つ一つのプロパティに同じように列挙すればできますが,
プロパティの数が多いので,

javascript

1 Object.defineProperties(B.prototype, 2 {instance_a:{set:function(value){ 3 for(var val of Object.getOwnPropertyNames( A.prototype )){ 4 this.attr[val] = value[val] 5 } 6 } 7 })

などとしたいのですが
,余計なsomeActionなどのインスタンスメソッドやconstructorなどが一緒に取得されてしまいます。これらを排除して,propertyを得るようなメソッドはありますか?

なければ全部列挙すれば済むのですが,もしそれより簡単にできる方法をご存知の方や思いつく方がいらっしゃれば教えていただければと思います。宜しくお願いします。

追記

for文で回したい理由があって実はpropertyのsetter経由で代入を行うと,viewの変更も同時に行うように設定したくて,

javascript

1properties = {}; 2for(var val of Object.getOwnPropertyNames( A.prototype )){ 3 properties[val] = {set:((val)=>{(value)=>{ 4 this.instance_a[val] = value; 5 updateView(value); 6 }})(val)}; 7} 8Object.defineProperties(B.prototype,properties) 9

としてvalueの条件分岐でViewをupdateするメソッドを作っています。
なのでObject.getOwnPropertyNames( A.prototype )から余計なpropertiesを弾く方法で実装したいという経緯があります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Polyfillを使うとして、こういうことでしょうか。

JavaScript

1var a = new A(2,3,4), 2 b = new B(); 3Object.assign(b.instance_a, a);

Re: tkow さん

投稿2016/10/05 06:27

think49

総合スコア18164

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/10/05 06:31

polyfillにそういう機能あるんですね。 これってpropertyが連想配列や配列でもdeepcopyになるんでしょうか?
退会済みユーザー

退会済みユーザー

2016/10/05 06:55

すみません。資料ありがとうございます。 実はなぜこういう実装をしたいのかということを追記したのでご面倒でない範囲であれば見ていただけると嬉しいです。 reactiveプログラミングで解決する話なのですが,共同開発でそれらのライブラリを導入するのがためらわれているので,処理が複雑な部分を隠蔽してそれっぽい実装をできるようにしようとしています。
think49

2016/10/05 07:12 編集

実装したいのはシャローコピーではなく、__proto__ を除外したプロパティ列挙という事でしょうか。 Object.keys(a) もしくは Object.getOwnPropertyNames(a) でどうでしょうか。
退会済みユーザー

退会済みユーザー

2016/10/05 08:48

どちらもメソッドを含めてしまうので,妥協してthis.attrというプロパティを作り連想配列を使ってObject.keys(A.prototype.attr)で渡すことにしました。お答え頂きありがとうございました。
think49

2016/10/05 09:01

うーん…、OwnPropertyを列挙して __proto__ なプロパティを取り除きたいと解釈していましたが、A.prototype から関数以外のプロパティを列挙したいという意味だったのでしょうか。 function A (a,b,c) { this.a = a; this.b = b; this.c = c; } A.prototype = {d: function () {}, e: 1} Object.keys(new A); // ["a", "b", "c"] (←メソッドは列挙していないので目的を達成しているように見える) // OwnProperty ではなく、A.prototype の列挙が目的(関数以外を列挙したい?) Object.keys(A.prototype); // ["d", "e"] (← "d" を列挙せず、"e" だけ列挙したい?)
退会済みユーザー

退会済みユーザー

2016/10/05 09:35

わかりづらくてすみません。自分で解決してしまい恐縮なのですが, >A.prototype から関数以外のプロパティを列挙したいという意味 私も最初これだけできれば良いと思っていたのですが,setterやgetterの設定されているacceccorはmethod扱いになっていたので,以上の方法で抽出することができず,これを含めるために,attr配下に欲しいpropertyだけを集める方法に落ち着いたという感じです。 質問中に色々試していて,実現したいことの状況が変わってしまったので,申し訳なかったです。 質問におけるコピー代入をする方法はお答えいただいた通りの方法を再帰すればできるのでベストアンサーにさせていただきますね。 お答えいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問