2016-03-17 1 views
2

** EDITED ** Для данной функции яваскрипта XКак я заставить яваскрипт класса игнорировать добавлялись поля на выходе

X=function(obj){ 
    /* code here */ 
} 

Как изменить функцию X таких, что

i1=new X({a:1,b:2}); 
i1.c=3; 

console.log(i1) to output as -> {a:1,b:2} 

тем самым игнорируя внешне добавляемые свойства «с»

+6

Вы не можете этого сделать. – epascarello

+0

Вы хотите, чтобы кто-то мог сделать 'i1.c = 3;' или вы хотите разрешить 'i1.c = 3;', так что 'console.log (i1.c)' будет показывать '3', но скрыть его в 'console.log (i1)'? –

+0

Мне очень жаль, но вы можете перепроверить мой пост, когда я редактировал вопрос. –

ответ

0

Вы можете попробовать переопределить метод ToString:

X.prototype.toString = function() 
{ 
    return this.a + " " + this.b; 
} 
+1

Это не сработает, поскольку внутренний объект присваивается свойствам, пока он не инициализирован. –

+1

'Uncaught TypeError: Невозможно установить свойство 'a' неопределенного (...)' –

+0

Вы можете инициализировать внутренний объект как 'this.inner = {}'. Это позволит вам добавлять свойства к внутреннему объекту –

1

Это может быть возможным, если в es2015 с помощью proxy «s handler.set, это ловушка для установки значения свойства, так что вы можете использовать его, чтобы проверить, является ли свойство собирается установить внешнее или нет.

Обновлено для удовлетворения запроса, что ожидает, что свойства будут заданы с помощью конструктора.

Однако, может быть больше подходит для использования Dmitri Pavlutin's answer, не знал этого, тоже выучил урок.

X = function(props){ 
 
    
 
    // Copy properties if given an input object 
 
    if (attrs instanceof Object) { 
 
    var key; 
 
    for (key in props) { 
 
     if (attrs.hasOwnProperty(key)) { 
 
     this[key] = props[key]; 
 
     } 
 
    } 
 
    } 
 
    
 
    // Wrap a proxy. 
 
    return new Proxy(this, { 
 
    set: function(target, property, value, receiver) { 
 
     // Anyway that check if property to set is an external one. 
 
     if (typeof target[property] === 'undefined') { 
 
     console.log("No"); 
 
     } else { 
 
     target[property] = value; 
 
     } 
 
     return true; 
 
    } 
 
    }) 
 
}; 
 

 
i1=new X({a: 1, b: 2}); 
 
i1.c=3; 
 
console.log(i1); 
 

 
i1.a= 2; 
 
console.log(i1);

+0

Отличный ответ. Не знал об этом. Однако мне очень жаль, но вы можете перепроверить мой пост, когда я отредактировал вопрос. Я ожидаю, что свойства будут заданы с помощью конструктора. Во-вторых, я не предполагаю, что это решение будет работать для nodejs. –

2

Что вы можете сделать, это использовать Object.preventExtensions() метод, который блокирует возможность добавлять новые собственные свойства объекта:

var X = function() { 
    this.a = 1; 
    this.b = 2; 
    Object.preventExtensions(this); 
}; 

var i1 = new X(); 
i1.c = 3; 

console.log(i1); // prints "{a: 1, b: 2}" 
console.log(i1.c); // prints `undefined` 

Пожалуйста, проверьте этот jsbin для полного пример.
Обратите внимание, что добавление нового собственного имущества к не расширяемому объекту в strict mode может выдать TypeError.

Смежные вопросы