2016-08-26 9 views
1

У меня есть объект, который оборачивает некоторые данные:возвращает объект собственность и сохраняют методы

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. Как мне это сделать, если это возможно? Я думал, что sth, как getter, будет подходящим, но не может понять, где и как его назначить.

+1

Так почему же 'console.log (obj1.method())'? – Li357

+0

Я не понимаю, в чем проблема. Как назначить геттер? взгляните на [Object.defineProperty] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) – Thomas

+0

Итак, вы хотите записать 'obj2'? 'console.log (obj1.obj2)' – Li357

ответ

1

Насколько я понял, вы пытаетесь скрыть 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());

1

, если я правильно понимаю, вы можете использовать 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()) 
0

Поскольку вы звоните 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.

0

Придерживаться исходным фрагмент завод выглядит как хороший вариант:

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' 

Можно даже передать реквизит в качестве аргумента, чтобы получить более гибкий способ объектов нерестовых с «unenumerable» метод доступа к закрытым членам ,

+0

Это отличная идея. Для клонирования вы можете использовать 'Object.assign()': https://developer.mozilla.org/pl/docs/Web/JavaScript/Reference/Global_Objects/Object/assign;) – Argo

+0

Хорошая точка! Обновление ответа ... – 36ve