17

C#/ PHPから来て、Javascriptで作成するクラス(関数)に完全なゲッター/セッターが欲しいです。

ただし、私が遭遇したJavascriptコードの多くでは、ゲッターとセッターは使用されておらず、単純なパブリック変数が使用されています。

ゲッターとセッターに関するJohnResigの記事を見つけてうれしく思いましたが、一部のブラウザーは「ゲッターとセッターをサポートしていない」と述べているコメントがあります。これは、Javascriptの「機能」ではなく、基本的なJavascript構文を使用する単純なパターン。この記事も2007年に書かれたので、今では時代遅れになっている可能性があります。

Javascriptのゲッターとセッターの現在の状態は何ですか?それらは実際に今日のすべてのブラウザで「サポート」されていますか(それが意味するものは何でも)?それらはJavascriptの便利なプログラミングパターンですか、それともJavascriptクラス(関数である)はパブリック変数を使用する方が良いですか?以下よりもそれらを実装するためのより良い方法はありますか?

$(document).ready(function() {
    var module = new Module('idcode');
    module.set_id_code('new idcode');
    module.set_title('new title');
    $('body').html(module.get_id_code()+': '+module.get_title());
});

function Module(id_code, title) {
    var id_code = id_code;
    var title = title;

    //id_code
    this.get_id_code = function() {
        return id_code;
    }
    this.set_id_code = function(value) {
        id_code = value;
    }

    //title
    this.get_title = function() {
        return title;
    }
    this.set_title = function(value) {
        title = value;
    }
}
4

7 に答える 7

15

Firefox、Safari、Chrome、および Opera (ただし IE は除く) にはすべて、同じ非標準のgetterおよびsetterメカニズムが組み込まれています。ECMAScript 5 には、現在ブラウザーに採用されており、将来的に標準になる別の構文が含まれています。IE 8 には既にこの機能がありますが、DOM ノードのみであり、通常のネイティブ JavaScript オブジェクトではありません。構文は次のようになります。

var obj = {};

Object.defineProperty(obj, "value", {
    get: function () {
        return this.val;
    },
    set: function(val) {
        this.val = val;
    }
});
于 2010-12-15T15:54:22.773 に答える
9

あなたは要点を見逃していると思います。(または、他の回答者が要点を見逃している可能性があります。) ECMAScript は「舞台裏」のゲッター/セッター メカニズムを提供するため、

x.foo = 3;
y = x.foo;

本当に(一種の)に変換されます

x.PutValue("foo",3);
y = x.GetValue("foo");

ここでPutValue、 とGetValueは名前がなく、プロパティのセッターとゲッターの関数に直接アクセスすることはできません。( ECMAScript 標準、第 3 版、セクション 8.7.1. および 8.7.2 を参照) 第 3 版では、ユーザーがカスタム getter および setter 関数を設定する方法を明示的に定義していないようです。Mozilla の Javascript の実装は、たとえば (これは Javascript 1.8 を使用するJSDBにあります):

js>x = {counter: 0};
[object Object]
js>x.__defineGetter__("foo", function() {return this.counter++; });
js>x.foo
0
js>x.foo
1
js>x.foo
2
js>x.foo
3
js>x.foo
4

構文は (少なくともこれまでは) ブラウザー固有です。少なくともこの SO questionによると、特に Internet Explorer が不足しています。

ECMAScript 標準の第 5 版では、このメカニズムが標準化されているようです。ゲッターとセッターに関するこの SO の質問を参照してください。


edit :おそらく、あなたの目的のためのより実用的な例:

function makePrivateObject()
{
   var state = 0;
   var out = {};
   out.__defineSetter__("foo", function(x) {});
   // prevent foo from being assigned directly
   out.__defineGetter__("foo", function() { return state; });
   out.count = function() { return state++; }
   return out;
}

js>x = makePrivateObject()
[object Object]
js>x.foo
0
js>x.foo = 33
33
js>x.foo
0
js>x.count()
0
js>x.count()
1
js>x.count()
2
js>x.foo
3
于 2010-12-15T14:58:44.320 に答える
5

どうですか:

function Module(id_code, title) {
    var id_code = id_code;
    var title = title;

    var privateProps = {};

    this.setProperty = function(name, value) {
      // here you could e.g. log something
      privateProps[name] = value;
    }

    this.getProperty = function(name) {
      return privateProps[name];
    }
}

ここでの getter メソッドと setter メソッドは、他のメソッドからはアクセスできないプロパティを格納するために使用されるプライベート オブジェクトで動作します。したがって、たとえば、プロパティが変更されるたびに (getter/setter メソッドの目的の 1 つとして) ログを記録したり ajax を実行したりする setter (または getter) を実装できます。

于 2010-12-15T14:38:00.567 に答える
2

私はこれが好き :

//  Module
var Module = function() {

    // prive getter/setter value
    var __value;

    // private getter/setter method
    var _value = function() {
        if(!arguments.length) return __value;
        else __value = arguments[0];
    };

    // output/public     
    return {
        value: _value
    };
}
于 2014-03-20T22:54:49.613 に答える
0

ゲッターとセッターは機能ではありませんが、プロパティ構文をサポートしない言語の「デザインパターン」(この場合はコードの膨張)です。

Javascriptはゲッターとセッターを必要としないので、それらを書きたくありません。利用可能な言語機能を使用してください。ある言語ではうまく機能するイディオムは、別の言語ではうまく機能しません。

私のお気に入りの引用の1つは、Pythonのコミュニティからのものです。

私たちは皆、ここで大人に同意しています

プライベート変数と情報隠蔽が必要ない理由を議論するとき。

見積もりはここにあります。

言語があなたに何を提供するかを学び、その文化とルールを受け入れてください。

于 2010-12-15T14:34:24.263 に答える