gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:19:03 26 4
gpt4 key购买 nike

我正在编写一个 Javascript API 库,为消费者提供一个界面,使他们能够与我们的后端网络服务进行交互。可以设想,消费者将编写一个 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: creation of object from an already instantiated object versus the prototype

最佳答案

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

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

但是您的实现允许客户接下来做:

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

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

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

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

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

关于用于维护状态和创建提供附加功能的嵌套对象的 Javascript 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16891320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com