0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【メモ】JavaScriptのメンバ変数までprototypeを付けてしまった場合のNGとOKケース

Posted at

JavaScriptでクラスをnewして作ったインスタンスAと、もう1つnewで作ったインスタンスBがある時、AとBの各メンバ変数を変更した後で両方を出力してみたらAとBが同じになっていて驚いた!

よくよくソースを見てみたらメンバ変数にまでprototypeを付けてしまっていたからこうなっただけだったorz
……というだけの話。

実際のコードと、デモ

デモはjsfiddleで確認できます。

NGケース

デモ:https://jsfiddle.net/pinoxox/6bryu4ka/

    var MyClass = function() {};
    MyClass.prototype.vars = {
        memba : ''
    };
    MyClass.prototype.init = function(opt) {
        $.extend(this.vars, opt); // jQuery利用想定
    };
    MyClass.prototype.print = function() {
        $('body').append( '<p>'+ this.vars.memba +'</p>' );
    };
    var cA = new MyClass();
    cA.init({ memba : 'hoge' });
    cA.print(); // -> hoge
    var cB = new MyClass();
    cB.init({ memba : 'fuga' });
    cB.print(); // -> fuga
    cA.print(); // -> hoge ではなく fuga

OKケース

デモ:https://jsfiddle.net/pinoxox/7xw9L1k6/


    var MyClass = function() {
        this.vars = {
            memba : ''
        };
    };
    MyClass.prototype.init = function(opt) {
        $.extend(this.vars, opt); // jQuery利用想定
    };
    MyClass.prototype.print = function() {
        $('body').append( '<p>'+ this.vars.memba +'</p>' );
    };
    var cA = new MyClass();
    cA.init({ memba : 'hoge' });
    cA.print(); // -> hoge
    var cB = new MyClass();
    cB.init({ memba : 'fuga' });
    cB.print(); // -> fuga
    cA.print(); // -> hoge は保たれる
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?