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.record
是 undefined
- 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
命名空间。
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.record
是 undefined
- 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
命名空间。