2015-10-23 2 views
0

Мне просто интересно, почему все говорят использовать WeakMap над Symbol для создания частных членов в классе javascript.создание частных членов на классе es6

Что лучше о:

const NAME = new WeakMap(); 
class foo { 
    constructor(name){ 
     NAME.set(this, name); 
    } 

    get name(){ 
     return NAME.get(this); 
    } 
} 

против:

const NAME = Symbol(); 
class foo { 
    constructor(name){ 
     this[NAME] = name; 
    } 

    get name(){ 
     return this[NAME]; 
    } 
} 

есть ли улучшение скорости или улучшение памяти с помощью WeakMap? Идея иметь отражение, доступное для использования при использовании Symbol для меня, была бы победой для использования Symbol. Итак, я думаю, мой вопрос - это просто почему WeakMap над Symbol?

Thanks

ответ

3

Потому что символы не являются частными. Если у вас есть ссылка на объект, вы можете получить его символы:

var o = {}; 
(function trusted() { 
    o[Symbol()] = "private data"; 
})(); 
o[Object.getOwnPropertySymbols(o)[0]]; // "private data" - Oops!! 

Вместо WeakMaps будет недостижим, если вы держите их приурочены в доверенном закрытия:

var o = {}; 
(function trusted() { 
    var wm = new WeakMap(); 
    wm.set(o, "private data"); 
})(); 
// A reference to `o` is not enough to access "private data" :D 

Однако, обратите внимание, что они не совершенно частное ни:

var leaked; 
(function attacker(_set_ = WeakMap.prototype.set) { 
    WeakMap.prototype.set = function(key, value) { 
    _set_.apply(this, arguments); 
    leaked = value; 
    }; 
})(); 
(function trusted() { 
    var wm = new WeakMap(); 
    wm.set({}, "private data"); 
})(); 
leaked; // "private data" - Oops!! 
+0

Правильно, и я приравнять Object.getOwnPropertySymbols к рефлексии и так IMO они все еще частные же, как и члены C#/Java может быть помечен как личный. Точно так же, как вы можете использовать отражение в C# или Java для установки частных членов, я не вижу проблемы, что вы можете сделать то же самое в javascript. Является ли это основной причиной отсутствия отвращения к использованию Symbol для частных членов? – weagle08

+0

@ weagle08 Я думаю, что это главная причина. Ну, в случае не принадлежащих им объектов некоторые люди могут думать, что хранение данных в них является морально неправильным. – Oriol

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