0

我有一个 javascript 对象,它通常需要用 5 个以上的变量进行初始化,我不认为每次创建对象时为每个变量使用一堆设置器new Person会很好。也许是构造函数?如何将构造函数放入我的模块对象中?我找到了一个如何在 javascript 中编写构造函数的示例,但我不确定它是否适合该对象的设计方式:Constructors in JavaScript objects

我希望能够用变量初始化每个人以设置人的私人信息:

var p = new Person(a, b, c, d, e);

我的对象:

var Person = (function() {

    // private

    var name;
    var gender;
    var weight;
    var location;

    return {
        // public
        myfunc: function() {

        }
    }

})();
4

3 回答 3

2

像这样:

function Person(a,b,c,d,e) {
    this.name = a;
    this.gender = b;
    this.weight = c;
    this.location = d
    this.whatever = e;

}
Person.prototype.myName = function () { return this.name; }
Person.prototype.myGender = function () { return this.gender; }


var p = new Person("John", "male", 180, "USA", "Something");
p.myName();
p.myGender();

这使用了 JS 的内部对象和继承模型,因此您可以设置单个对象的唯一变量,而只指定/创建一次 in-comman 函数和方法,然后“Person”对象的所有实例都将使用这些

于 2013-04-14T01:45:32.010 回答
1
var Person = function(name) {
    var gender = "male";

    this.changeName = function(newName) {
        name = newName;
    };

    this.displayName = function() {
        return "<p>" + name + "</p>";
    };

    this.displayGender = function() {
        return "<p>" + gender + "</p>";
    };
}

var bart = new Person("Bart");
document.body.innerHTML = bart.displayGender();

该解决方案基于“闭包”继承模型(http://javascript.crockford.com/private.html

关于原型继承模型,请参考 SReject 的解决方案。请注意,它不允许真正的私人成员。

于 2013-04-14T01:56:27.313 回答
1

此模式将为您提供封装的数据(隐藏字段),并让您轻松控制如何公开访问它们:

var PersonFactory = {    
    create: function (nm, gn, wt, loc) {
        var name = nm,
            gender = gn,
            weight = wt,
            location = loc;

        return function (method, arg) {
            if (method === 'isName') {
                if (name === arg) {
                    return true;
                } else {
                    return false;
                }
            } else if (method === 'isFemale') {
                if (gender === arg) {
                    return true;
                } else {
                    return false;
               }
            }

        }
    }
};

var chris = PersonFactory.create("Chris", "male", 210, "Pluto");
chris('isName', 'Chris'); // returns true
var jane = PersonFactory.create("Jane", "female", 160, "Alpha Centauri");
jane('isName', 'Jane'); // returns true
jane('isName', 'Chris'); // returns false

我希望这就是你要找的。请记住,只有函数对象可以隐藏数据,这还不错,因为您可以使用 immaFunciton('methodName', 'args') 模式以非常简单的方式访问该数据。

祝你好运,奇尔斯

于 2013-04-14T03:05:58.010 回答