为什么在服务中的函数中使用let和new创建新对象时会得到旧对象?

时间:2017-03-07 00:18:08

标签: javascript angular typescript

好吧,angular2中简单的基本身份验证服务。

当用户第一次登录时,它可以正常工作。但是当他/她尝试使用其他帐户第二次登录时。我在请求标题中有双重基本身份验证字符串,它类似于"授权:基本YWRtaW46YWJjMTIz,基本RMcasd9WJjMXoPj"。

这是服务:

@Injectable()
export class AuthenticationService {
private url: string = 'http://localhost:8080/api/test';
private username: string;
private password: string;
private authenticationStatus: boolean = false;

constructor(private http: Http) { }

authentication(username: string, password: string): Promise<boolean> {

    let headers = new Headers(); // <== previous headers object with old Authorization string get back from grave.
    console.log(headers);  

    headers.append("Authorization", "Basic " + btoa(username + ":" + password));
    headers.append("Content-Type","application/json;charset=utf-8");

    return this.http.get(this.url, { headers: headers })
        .toPromise()
        .then(response => { ...

这是我第一次尝试使用angular / typescript应用程序。当我在这里使用let和new时,我感到困惑的是没有得到一个全新的对象。是因为header类中的headersString是静态的吗?我确实研究过angular headers class api doc。我尝试在headers.delete("Authorization");之后立即致电let headers = new Headers();,旧的授权标题仍然存在。

1 个答案:

答案 0 :(得分:0)

  

当我在这里使用let和new时,我对于没有获得一个全新的对象感到困惑。

记录对象时,会记录引用到对象。

举个例子:

let x = {};
console.log(foo);
x.foo = 'foo';

现在在你的控制台上,如果你在之后看x 你已经改变它,它会显示新的东西:

enter image description here

简而言之。你的代码是正确的。控制台可以欺骗你。

替代答案:您正在做的事情未在您提供的代码示例中演示。