es5 中的方法链接 类

Method chaining in es5 classes

CurrentUser = function (){}
CurrentUser.prototype = {
    record: undefined
}
CurrentUser.prototype.is = {
    get _parent() {return CurrentUser.prototype},

    get signedIn() {
        return !!this._parent.record
    }
}
User = new CurrentUser
User.record = {name:'Joe'}
User.is.signedIn //false

我想在这里做的是创建一个新用户,给他一些数据(记录)并根据该数据确定他已登录(如果他的记录有数据 - 他已登录)。

但实际情况是 User.is.signedIn getter 正在访问 CurrentUser.prototype 而不是访问 User 实例。并且 CurrentUser.prototype.recordundefined - User.is.signedIn returns false.

 class CurrentUser {
   constructor(){
    this.record = null; 
   }

   get isSignedIn(){
     return !!this.record;
   }

 }

const user = new CurrentUser;
console.log( user.isSignedIn );

user.record = {what:"ever"};
console.log(user.isSignedIn);

只需将 getter 放入原型本身而不是子对象中。

不行,不行。

解决方法 1(使用 call 方法调整 this 绑定规则):

    function Foo() {
    this.x = 10; 
    }
    
    Foo.prototype.bar = {
    baz: function() {
    return this.x; 
    } 
    };
    
    var y = new Foo();
    
    console.log(y["bar"]["baz"].call(y));


解决方法 2(我们在实例化时将对实例化对象的引用添加到 Foo.prototype.bar):

function Foo() {
Foo.prototype.bar._this = this;
this.x = 10;
}

Foo.prototype.bar = {
baz: function() {
return this._this.x; 
} 
};

var y = new Foo();

console.log(y["bar"]["baz"]());

参见 this question, or this one

您似乎在寻找

CurrentUser = function (){}
CurrentUser.prototype = {
    record: undefined,
    get is() {
        var parent = this;
        return {
            get signedIn() {
                return !!parent.record;
            }
        };
    }
};
var user = new CurrentUser
user.record = {name:'Joe'}
user.is.signedIn // true

但是我真的建议避免这种情况。在原型上放置一个简单的 isSignedIn() 方法并完成它。

我最终这样做了(找到解决方案后看到了 Bergi 的回答)

CurrentUser.prototype = {
    record: undefined,
    get is() { return {
        _parent: this,
        get signedIn() {return !!this._parent.record}
    }}
}

User = new CurrentUser
User.record = {name:'Joe'}
User.is.signedIn //true

我们使 is getter return 成为一个包含对 CurrentUser.prototype 的引用的对象,方法是将其分配给 _parent。而这个对象又拥有自己的 getter,在访问 _parent 时可以访问 CurrentUser.prototype。瞧!
顺便说一句,如果 is getter 中有许多其他 methods\getters - 您可以将其重构为独立对象,然后通过 Object.defineProperty() 添加到 CurrentUser.prototype .

PS
许多人建议不要链接 class 方法,但没人能说 为什么 .
我希望我的代码尽可能接近人类语言——而且 User.is.signedIn 在我看来比 User.isSignedIn 更好;我还在 is 方法中放置了许多其他 is 相关的检查 - 所以它们不会弄乱 User 命名空间。