使用模块模式的JavaScript类原型

时间:2012-08-16 11:01:06

标签: javascript design-patterns module this prototype

我正在寻找在JavaScript中定义类的方法。我提出了混合模块和原型模式,但不确定我是否不会错过任何东西。基本上我想使用'this'关键字。例如:

var A = function()
    {
    this.x = 10;
    };

A.prototype = (function()
    {
    function privatePrint()
        {
        alert("Printing from private! x:" + this.x);
        }
    this.print = function()
        {
        privatePrint.call(this);
        };
    return this;
    }).apply(A.prototype);

var a = new A();
a.print();

返回值仅用于提高可读性 - 可以在开头使用A.prototype。

模式我也尝试过:

  • 模块:无法使用'new'关键字。
  • 原型,揭示原型: 如果在原型声明中声明私有函数,则不会扩展 (对象返回的公共方法)

我的方法可以接受吗?

2 个答案:

答案 0 :(得分:0)

**Public**

function Constructor(...) {
   this.membername = value;
}
Constructor.prototype.membername = value;

**Private**

function Constructor(...) {
   var that = this;
   var membername = value;
   function membername(...) {...}

}

Note: The function statement

function membername(...) {...}

is shorthand for

var membername = function membername(...) {...};

**Privileged**

function Constructor(...) {
   this.membername = function (...) {...};
}

答案 1 :(得分:0)

自从你问过这两年以来,但在谷歌搜索类似的方法,我最终到了这里。除了(因为你基本上是在征求意见)之外,我没有看到你的实现的缺点,它似乎有点令人困惑,为什么你把原型作为IIFE的导入传递。

否则,您所拥有的内容与其他"标准"非常相似" Revealing Prototype Pattern" 的实现,我已经基本上看到了这样做:

(function (NS) {

    'use strict';

    // constructor for the Person "Class", attached to your global namespace
    var Person = NS.Person = function (name) {
        // set properties unique for each instance
        this.name = name;
    };

    // may not be necessary, but safe
    Person.prototype.constructor = Person;

    // private method
    var _privateMethod = function() {
        // do private stuff
        // use the "_" convention to mark as private
        // this is scoped to the modules' IIFE wrapper, but not bound the returned "Person" object, i.e. it is private
    };

    // public method
    Person.prototype.speak = function() {
        console.log("Hello there, I'm " + this.name);
    };

    return Person;

})(window.NS = window.NS || {}); // import a global namespace

// use your namespaced Person "Class"
var david = new NS.Person("David");
david.speak();

还有一个类似的模块模式,其结构可能更像是" Class"实施,你在追求:

(function (NS) {

    'use strict';

    // constructor for the Person "Class", attached to your global namespace
    var Person = NS.Person = function (name) {

        // reset constructor (the prototype is completely overwritten below)
        this.constructor = Person;

        // set properties unique for each instance
        this.name = name;
    };

    // all methods on the prototype
    Person.prototype = (function() {

        // private method
        var _privateMethod = function() {
            // do private stuff
            // use the "_" convention to mark as private
            // this is scoped to the IIFE but not bound to the returned object, i.e. it is private
        };

        // public method
        var speak = function() {
            console.log("Hello there, I'm " + this.name);
        };

        // returned object with public methods
        return {
            speak: speak
        };
    }());

})(window.NS = window.NS || {}); // import a global namespace

// use your namespaced Person "Class"
var david = new NS.Person("David");
david.speak();

要点:https://gist.github.com/dgowrie/24fb3483051579b89512