14

モジュール パターンについて読んだ後、公開したいプロパティを返す方法をいくつか見てきました。

最も一般的な方法の 1 つは、プライベート プロパティとメソッドとは別に、"return" ステートメント内でパブリック プロパティとメソッドを宣言することです。同様の方法 (「明らかにする」パターン) は、公開したいプロパティとメソッドへの参照を提供するだけです。最後に、私が見た 3 番目の手法は、モジュール関数内に新しいオブジェクトを作成することでした。このオブジェクトに新しいプロパティを割り当ててから、そのオブジェクトを返します。これは興味深いアイデアでしたが、新しいオブジェクトを作成する必要があります。

だから私は考えていthis.propertyNameました、パブリックプロパティとメソッドを割り当てるために使用return thisして、最後に使用しないのはなぜですか? var通常のorfunction構文を使用してプライベート プロパティとメソッドを作成したり、this.propertyName構文を使用してパブリック メソッドを宣言したりできるため、この方法は私にははるかに簡単に思えます。

私が提案している方法は次のとおりです。

(function() {

var privateMethod = function () {
    alert('This is a private method.');
}

this.publicMethod = function () {
    alert('This is a public method.');
}

return this;

})();

上記の方法を使用することに長所/短所はありますか? 他の人はどうですか?

4

5 に答える 5

30

関数にはオブジェクト コンテキストがないため、この場合thisはグローバル オブジェクトを参照します。window割り当てたすべてのプロパティはthis、グローバル名前空間を自動的に汚染します。

(function() {
    console.log(this == window); // true

    this.publicMethod = function () {
        alert('This is a public method.');
    }

})();

console.log(publicMethod); // function()

オブジェクトを明示的に渡して、使用するコンテキストを伝えることができます。

var MYAPP = {};

(function() {
    // 'this' will now refer to 'MYAPP'
    this.publicMethod = function () {
        alert('This is a public method.');
    }
}).call(MYAPP);

console.log(publicMethod); // undefined
console.log(MYAPP.publichMethod); // function()

多少他のスタイルで書くことができます:

var MYAPP = (function(my) {
    var my;
    ⋮
    return my;
})(MYAPP);

そして、すでに議論したパターンにたどり着きました。詳細については、無名関数のスコープに関する Dustin の記事を参照してください。

于 2010-04-26T12:39:07.987 に答える
4

I would recommend the style where you add your public properties and methods to an anonymous object that you then return:

var myModule = (function() {
    function privateMethod() { ... }
    function publicMethod() { ... }

    return { publicMethod: publicMethod };
})();
于 2010-04-26T12:41:58.147 に答える
2

もう 1 つのオプションは、この参照を完全に避けることです。代わりに、無名オブジェクトを作成して返す関数を定義してください。

function makeThing(someAttribute) {
  var privateVariable = 42;

  function someMethod() {
    return privateVariable;
  }

  return {
    "publicMethodName": someMethod,
    "getAttribute": function() {
      return someAttribute;
    }
  };
}

var thing = makeThing(99);
thing.publicMethodName();
thing.getAttribute();
于 2010-04-26T19:06:31.563 に答える
2

メソッドを公開する場合は、次のようにします。

var export = (function() {

var privateMethod = function () {
  alert('This is a private method.');
}
var export = {};

export.publicMethod = function () {
  alert('This is a public method.');
}

return export;

})();
于 2010-04-26T12:42:56.543 に答える
1

モジュールのパターンを明らかにする:

var m1 = (function(){ return {method: mthod} })();
var m2 = new function Singleton(){ return {method: mthod} };
var m3 = ({}).prototype = {method: method};
var m4 = ({}).prototype = (function(){ ... })();
var m5 = (function(){}).prototype = {} || (function(){ ... })();

var m6 = (function(extendee){
    return extendee.prototype = {attr3: 'attr3'};
})({currentAttr1: 1, currentAttr2: 2});

また、メソッドチェーンが必要な場合:

var m = (function(){}).prototype = (function(){
    var thus = m;  // this
    console.log('m this-------', thus);

    function fn(){
        console.log('fn', thus);
        return thus;
    }
    function f(){
        console.log('f', thus);
        return 'poop';
    }

    return {f: f, fn: fn};
})();

console.log('M:', m, 'm.fn', m.fn(), 'm.fn.f', m.fn().f());

他にもたくさんの方法があり、モジュールを主役にすることもできます。

于 2013-09-19T22:38:37.103 に答える