用于维护状态和创建提供附加功能的嵌套对象的Javascript模式

时间:2013-06-03 06:46:15

标签: javascript design-patterns prototype

我正在编写一个Javascript API库,为消费者提供一个界面,使他们能够与我们的后端Web服务进行交互。设想消费者将编写一个javascript客户端Web应用程序,该应用程序严重依赖于库提供的API。

我想出了这个"模式"用于维护状态和制作功能"可用"满足某些条件(例如,在客户端登录经过身份验证的用户)。

这是实现这一目标的合适方式吗?或者我是否在不知不觉中打破了以后会咬我的一些惯例或最佳做法?

// file:clientApi.js(library)

ClientObject = function () {
    this.objectname = "a client class";
}

ClientObject.prototype.loginUser = function(name) {
    this.loggedin = true;
    if (typeof this.User === 'undefined') {
        this.User = new ClientObject.User(name);
    }
}
ClientObject.User = function (name) {
    this.username = name;
}

ClientObject.User.prototype.getProfile = function() {
    return 'user profile';
}

// file:app.js(使用应用程序)

var testClient = new ClientObject();
console.log('testClient.User = ' + (typeof testClient.User)); // should not exist
testClient.loginUser('Bob'); // should login 'bob'
console.log('testClient.User = ' + (typeof testClient.User)); // should exist
console.log(testClient.User.username); // bob
testClient.loginUser('Tom'); // should not do anything
console.log(testClient.User.username); // bob still
console.log(testClient.User.getProfile()); // tada, new functionality available

我的问题:这种方法有效吗?是否有一种我可以提供的模式可以提供更好的解释或方法来实现我的最终目标?

我在这里用一堆其他问题提出了类似的问题,不幸的是上面的代码在噪音中有些丢失:Javascript: creation of object from an already instantiated object versus the prototype

1 个答案:

答案 0 :(得分:2)

你的API应该有一些秘密。这就是为什么不公开所有功能的原因。让我们分析一下代码的一些部分:

testClient.loginUser('Tom'); // should not do anything

但是你的实现允许客户做下一步:

testClient.User = new ClientObject.User(name);

现在用户将更改为“Tom”。

让我们使用显示原型模式来更改您的clientApi.js代码:

ClientObject = function () {
    this.objectname = "a client class";
    this.username;
    this.User;
    this.loggedin;
 }    

ClientObject.prototype = function() {  
var loginUser = function(name) {
    this.loggedin = true;
    if (typeof this.User === 'undefined') {
        this.User = new User(name);
    }
};

var User = function (name) {
    this.username = name;
};

User.prototype.getProfile = function() {
    return 'user profile';
};

return {
    loginUser : loginUser
}
}()

现在,客户端无法像在库的第一个版本中那样更改已登录的用户。你可以使用一些变化,但这就是主意。