对象返回自己的属性并保留方法

Object returns own property and preserves methods

本文关键字:保留 方法 属性 返回 自己的 对象      更新时间:2023-09-26

我有一个对象来包装一些数据:

function Obj1() {
    var _foo = 'bar'
    this.obj2 = {
        'b': 'c'
    }
    this.method = function() {
        return _foo
    }
}
var obj1 = new Obj1()

现在,当我调用console.log(obj1);时,我希望它显示对象obj2的内容。诀窍是我仍然需要能够调用obj1.method并获得_foo的值。如果有可能,我该怎么做?我的想法是getter之类的东西是合适的,但不知道在哪里以及如何分配一个

据我所知,你试图隐藏method属性。要实现这一点,请使用Object.defineProperty。函数将不会被记录,因为enumerable属性默认为false,这阻止了属性显示在console.log中。

function Obj1() {
  var _foo = 'bar'
  this.obj2 = {
    'b': 'c'
  }
    
  Object.defineProperty(this.obj2, 'method', {
    value: function() {
      return _foo;
    }
  });
  
  return this.obj2;
}
  
var obj1 = new Obj1()
console.log(obj1);
console.log(obj1.method());

如果我理解正确,您可以使用prototype

例子
function Obj1() {
    this.obj2 = {
        'b': 'c'
    }
}
Obj1.prototype.method = function() {
    return 'bar';
}
var obj1 = new Obj1();
//prints only properties
console.log(obj1);
//prints method result
console.log(obj1.method())

既然你调用了new Obj1()。结果变量var obj1是一个类对象,而不是一个函数,为了获得obj2的值,您必须在控制台日志中调用obj1.obj2。如果你想要obj1保存obj2的值。然后使用以下代码

function Obj1() {
    var obj2 = {
       'b': 'c'
    }
    return this.obj2;
}
var obj1 = Obj1();
console.log(obj1);

这将在控制台日志中为您提供所需的结果,但是该对象将不再是一个类对象,并且将只有obj2的值。

坚持您的原始代码片段,工厂看起来是一个不错的选择:

function factory() {
    var foo = 'bar';
    var props = { b: 'c'};
    var proto = {
        method: function() { return foo; }
    }; 
    var obj = Object.create(proto);
    Object.assign(obj, props);
    return obj;
}
var obj = factory();
console.log(obj); // {b: 'c'}
console.log(obj.method()) // 'foo'

你甚至可以将props作为参数传递,以获得一种更灵活的方式,通过访问私有成员的"不可枚举"方法来生成对象。