使用模块模式的JavaScript类原型

我正在寻找用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可以在开始时使用。

我也尝试过的模式:

  • 模块:'新'关键字不能使用。
  • Prototype,Revealing原型:如果在原型声明中声明私有函数(由对象返回的公共方法),则不扩展
  • 我的方法可以接受吗?


    **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 (...) {...};
    }
    

    这是你问了两年多了,但在谷歌搜索一个类似的方法,我最终在这里。 除了(因为你实质上是在征求意见)之外,我没有看到你的实现有什么缺点,它似乎有点混淆你为什么将原型作为IIFE导入的原因。

    否则,你得到的东西看起来非常类似于我所见过的“显示原型模式”的其他“标准”实现:

    (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();
    

    还有一个类似的模块模式,它的结构可能更像是你之后的“类”实现

    (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

    链接地址: http://www.djcxy.com/p/50131.html

    上一篇: JavaScript class prototyping using module pattern

    下一篇: Javascript: Module Pattern vs Constructor/Prototype pattern?