假设我们有这样的对象:
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
答案 0 :(得分:1)
此设计的机械问题是基元(如字符串,数字和布尔值)不能具有自己的属性。您可以向原语的关联原型添加属性,例如String.prototype.doSomething = function() { ... }
,这将允许您执行"foo".doSomething()
。 (但是不建议这样做,因为您不应该modify objects you don't own。)但是,您不能将值附加到特定的原始字符串值,这意味着您无法实现data
和name
想。
相反,最好的选择可能是使用带有toString
方法的对象,该方法将使您可以将该对象字符串化为所需形式的字符串。这不会以console.log
的形式显示,但是如果您向其中添加了一个空字符串(如console.log(""+person)
),则会显示出来。
如果您想给将来维护您代码的任何人做噩梦,可以通过having your object include RegExp.prototype
in its prototype chain实现。我强烈,积极地劝阻您不要这样做,但前提是我在法律上也无法阻止您。是否应该(ab)以这种方式使用RegExp.prototype
在任何司法管辖区都不是犯罪。