命名空间对象原型

时间:2017-07-09 11:11:52

标签: javascript

我想用一些额外的方法来增强对象,例如将first()second()方法添加到数组但是使用命名空间,以便以[1, 2].item.second()的方式调用它,而不是[1, 2].second()。我得到的代码如下,但我得到undefined

Array.prototype.item = {
    first: function () {
        return this[0];
    },
    second: function () {
        return this[1];
    }
};

[1, 2].item.second()
// undefined
// I don't want to use [1, 2].second()

1 个答案:

答案 0 :(得分:2)

thisfirst()函数中的second()引用数组的item属性,而不是数组本身,这就是为什么你得undefined item 1}}。

最简单的方法是通过将Array.prototype.item = function() { var _this = this; return { first: function() { return _this[0]; }, second: function() { return _this[1]; } }; }; 转换为方法来捕获正确的上下文,如下所示:

[1, 2].item().first(); // 1
[1, 2].item().second(); // 2

然后:

Object.defineProperty(Array.prototype, 'item', {
  get: function() {
    var _this = this;

    return {
      first: function() {
        return _this[0];
      },
      second: function() {
        return _this[1];
      }
    };
  }
});

根据您的更新,如果您坚持使用原始属性语法,则可以尝试以下操作:

[1, 2].item.first(); // 1
[1, 2].item.second(); // 2

然后:

function isAuthenticated(req, res, next) {
var getToken = req.cookies.token;
var getUrl = req.originalUrl;
console.log(getToken)    
if(getToken == undefined) {
    res.redirect('/login')
    next()
} else {
    console.log('success')
    next()
}
next() }

router.get('/login', isAuthenticated, auth.login);
router.get('/logout', isAuthenticated, auth.logout);
router.post('/logging', auth.prosesLogin);

请参阅MDN