0

私のコードは次のようになります。

Random = function(name) {
    this.name = name;

    this.addSomething = function(a, b) {
        return a + b;
    }
}

Random.prototype.addStuff = function(a, b, c, d) {
    return this.addSomething(a, b) + this.addSomething(b, d);
}

this.addSomething関数自体とそのプロトタイプでのみ使用できるようにする必要がありますが、これは機能していません。

誰かが私を正しい方向に向けて、これを行う方法を教えてもらえますか? ありがとう。

4

2 に答える 2

2

「プライベート」メンバー/メソッドを作成する唯一の方法は、次のようなものです。

Random = function(name) {
    this.name = name;

    function add_something(a, b) {
        return a + b;
    }
    this.addStuff = function(a, b, c, d) {
        return add_something(a, b) + add_something(b, d);
    }
}

編集: RobG が彼の回答で述べたように、 Douglas Crockford によるこの記事は、パブリック、プライベート、および特権メンバー/メソッドが Javascript でどのように機能するかを理解するのに役立ちます。非常にオススメの読み物です。

于 2012-08-19T09:54:18.897 に答える
1

コンストラクターとして呼び出される関数は、デフォルトでプレーンオブジェクトを返します。他のタイプのオブジェクトを返すようにすることはできますが、そのオブジェクトはコンストラクターのプロトタイプから継承されません。[[Prototype]]また、関数オブジェクトのを変更することはできません(非推奨のprotoプロパティを無視します)。

コンストラクター(関数)とコンストラクターによって作成されたオブジェクトが同じメソッドを持つことができる唯一の方法は、両方が[[Prototype]]チェーン内のオブジェクトを共有することです。これは、Object.prototypeを拡張することによってのみ実行できます。これは、関数とオブジェクトの両方が共有できる唯一のオブジェクトだからです。

また、オブジェクトのパブリックメソッドへのアクセスを防ぐことはできません。プライベートメンバーをエミュレートすることはできますが、それはかなり弱いエミュレーションです。ただし、呼び出し元のオブジェクトが特定の「クラス」のインスタンスであることをメソッドでチェックすることができます。

function Foo(){}

Foo.prototype.bar = function() {
  return this instanceof Foo? 'success' : 'failure';
}

var foo = new Foo();
var blah = {};

// Call bar method of an instance of Foo
alert(foo.bar()); // success

// Call bar method on some other object
alert(Foo.prototype.bar.call(blah)); // failure

javascriptのそのようなソリューションは簡単になりすまし、堅牢な方法でやりたいことを行うことは不可能です。

于 2012-08-19T13:39:09.297 に答える