一道神奇的前端附加题

Jan 15, 2019 00:00 · 525 words · 2 minute read js

在知乎上有一篇文章 文中提给了一道前端附加题, 问题是在一个闭包里有一个对象”o” 它有N多属性, 在不修改下面代码的前提下, 编写代码获取这个对象的所有属性.

var foo = (function() {
    var o = {
        a: 1,
        b: 2,
        /**更多属性**/
    };
    return function(key) {
        return o[key];
    };
})();

原文对这道的解法有详细的解释. 在这里自己做一个记录.

foo是一个函数,传递一个key值返回”o”对象对应的value(比如: key=‘a’, 则返回 1). 如果通过foo能拿到”o”对象, 这道题就迎刃而解了(Object.keys获取对象的所有属性).

我们知道在js中所有的对象的构造函数都是Object. 也知道当获取对象的属性时先会查找自身的属性,如果没有找到会到原型链上找,而最后一个原型链就是Object.prototype. 如果我们为Object的原型添加一个属性”self”, 这个属性返回对象自己”this”, 这样在调用foo(‘self’) <==>o[‘self’] 就会返回我们想要的对象”o”

Object.defineProperty(Object.prototype, 'self', {
    get() { return this; }
});

var o = foo('self');
console.log(Object.keys(0)); // ['a', 'b']

如果不了解difinePropery可以参考我以前的博客