0

クラスを定義する完璧な方法を探しています。ここでの「完璧」とは次のことを意味します:`

  1. create instances はメソッドのコピーを作成しません。
  2. パブリック関数は簡単に(それほど面倒ではありませんが)プライベート変数にアクセスできます

たとえば、方法 1:

function Foo1() {
  var private1;
  this.publicMethod1 = function() {//create instance will create copy of this function}
}

上記のルール No.1 を満たしていません。

別の例、方法 2:

 function Foo2() {
      var private2;

    }
 Foo2.prototype.Method2 = function() {//cannot access private2}

上記のルール No.2 を満たしていません。

では、両方のルールを満たすことは可能でしょうか? ありがとう。

4

4 に答える 4

1

JavaScript では、規約が重要です。プライベート プロパティまたはメソッドは、 のように最初にアンダースコアで定義されます_private。いくつかのヘルパーを使用すると、クラスを簡単に作成できます。この設定は簡単だと思います。必要なのは、inheritsクラスを拡張するためのヘルパーだけです。複数の引数を使用する代わりに、オブジェクトを渡しprops、継承されたクラスでarguments. たとえば、モジュール パターンを使用すると、次のようになります。

Function.prototype.inherits = function(parent) {
  this.prototype = Object.create(parent.prototype);
};

var Person = (function PersonClass() {

  function Person(props) {
    this.name = props.name || 'unnamed';
    this.age = props.age || 0;
  }

  Person.prototype = {
    say: function() {
      return 'My name is '+ this.name +'. I am '+ this.age +' years old.';
    }
  };

  return Person;

}());

var Student = (function StudentClass(_super) {

  Student.inherits(_super);      

  function Student(props) {
    _super.apply(this, arguments);
    this.grade = props.grade || 'untested';
  }

  Student.prototype.say = function() {
    return 'My grade is '+ this.grade +'.'; 
  };

  return Student;

}(Person));

var john = new Student({
  name: 'John',
  age: 25,
  grade: 'A+'
});

console.log(JSON.stringify(john)); //=> {"name":"John","age":25,"grade":"A+"}
console.log(john.say()); //=> "My grade is A+"

プライベート変数の「問題」については、インスタンス プロパティの規則に固執し、他のすべてのプライベートに必要な場合はクロージャーを使用してください。

于 2013-03-05T07:03:41.223 に答える
0
function Foo3() {
    this.private = {};
}

Foo3.prototype.set_x = function (x) {
    this.private.x = x;
};
于 2013-03-05T06:50:20.763 に答える
0

長い話を短くするために:いいえ、そうではありません。private変数にアクセスできるメソッドでプロトタイプを拡張することはできません。少なくとも、これらのプライベート変数が。を介してプライベートにされている場合closure

ただし、たとえば、プライベートフィールドにアンダースコアを付けるのはjavascriptの規則です_myPrivateField。これらはまだ公開されていますが、私はこのソリューションが多くのライブラリで使用されているのを見てきました。また、最初のルールを満たすためにそのスタイルを好みます。

于 2013-03-05T06:51:38.497 に答える
0

基本的な例を以下に示します。

Foo = function(id)
{
    // private instances.
    var _id;
    var _self = this;

    // constructor
    _id = id;

    // private method
    function _get()
    {
        return _id;
    };

    // public function
    _self.set = function(id)
    {
        _id = id;
    };
    _self.get = function()
    {
        return _get();
    };
};

var bar = Foo(100);
console.log( bar.get() );
bar.set(1000);
console.log( bar.get() );

プロトタイプを使用することをお勧めします。

于 2013-03-05T07:28:24.560 に答える