首页 > 解决方案 > 对象可以自己保存值并返回它

问题描述

假设我们有这样的对象:

let person = {name: 'Ken', doSometing: ()=>{}, data:{}}

或这个:

let Person = function(name) {
    this.name = name;
    this.data = {};
    this.doSometing = ()=>{};
};
let person = new Person('Ken');

我很感兴趣,有没有办法制作这样的对象,但是在单独调用对象时获取名称属性(名称可以是字符串、数字、对象等):

console.log(person) //Ken

反而:

console.log(person.name) //Ken

标签: javascript

解决方案


这种设计的机械问题是基元(如字符串、数字和布尔值)不能有自己的属性。您可以向原语的关联原型添加一个属性,例如String.prototype.doSomething = function() { ... },这将允许您执行"foo".doSomething(). (但不鼓励这样做,因为您不应该修改不属于您的对象。)但是,您不能将值附加到特定的原始字符串值,这意味着您无法实现data以及name您想要的方式。

相反,最好的选择可能是使用带有toString方法的对象,该方法允许您将对象字符串化为所需形式的字符串。这不会以console.log形式显示,但如果您向其添加一个空字符串,例如console.log(""+person).

如果您想让将来维护您的代码的任何人做噩梦,您可以通过将您的对象包含RegExp.prototype在其原型链中来实现这一点。我强烈地、积极地劝阻你不要这样做,但假设我在法律上也没有能力阻止你;无论是否应该,(ab)RegExp.prototype以这种方式使用在任何司法管辖区都不是(尚未)犯罪。


推荐阅读