0

我正在寻找在 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 Prototype:如果在原型声明中声明了私有函数(对象返回的公共方法),则不扩展

我的方法可以接受吗?

4

2 回答 2

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 (...) {...};
}
于 2012-08-16T11:07:21.543 回答
0

自您问起已经两年多了,但是在谷歌搜索类似的方法时,我最终来到了这里。除了(因为您本质上是在征求意见)之外,我没有看到您的实现有任何缺点,为什么您将原型作为导入在 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

于 2015-01-31T05:30:25.457 回答