4

我正在编写一个 Javascript API 库,它为消费者提供了一个接口,使他们能够与我们的后端 Web 服务进行交互。设想消费者将编写一个 javascript 客户端 Web 应用程序,该应用程序大量使用库提供的 API。

我提出了这种“模式”,用于维护状态并在满足某些条件时使功能“可用”(例如,经过身份验证的用户登录客户端)。

这是实现这一目标的适当方式吗?还是我无意中打破了一些以后会咬我的约定或最佳实践?

// 文件:clientApi.js(库)

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';
}

// 文件: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:从已经实例化的对象与原型创建对象

4

1 回答 1

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

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

于 2013-06-05T11:40:52.543 回答