Создание объектов унаследованных от null на Node.js

Создание объектов унаследованных от null на Node.js

392
ПОДЕЛИТЬСЯ

От переводчика: поприще переводчика для меня ново, по этому прошу вас не судить строго.

Мне чрезвычайно приглянулась эта мысль, но в согласовании с MDN (Mozilla Developer Network), Object.create() не поддерживается до IE9, что делает этот способ наиболее требовательным при использовании в браузере. Zakaz представил, что это может быть применено для сотворения безопасного объекта «cache». Таковой объект не унаследует Object.prototype и, соответственно, не будет иметь его, Object.prototype, способов. Но в Node.js, на сервере, этот способ поддерживается на сто процентов. Когда-то, читав Принципы Объектно-нацеленного JavaScript за авторством Nicholas Zakas , я наткнулся на совет о использовании Object.create(), для сотворения объектов унаследованных от null.

к. По этому люди предпочитают применять Object.prototype.hasOwnProperty() заместо оператора «in». Когда вы создаете объект в JavaScript, то этот объект автоматом наследует способы Object.prototype. в этом случае найдутся такие способы объекта как «valueOf» и «toString» (в итоге подъема по иерархии прототипов). Из-за этого объект становится «опасным» для проверки существования ключей с помощью оператора «in», т.

Как такой, этот объект, становится чрезвычайно близок к объекту который не содержит предопределенных системой способов. Но раз вы создадите объект унаследованный от null, используя Object.create(), то не будет иерархии наследования.

Что бы узреть как это работает посмотрите на последующий Node.js скрипт:
Это дозволит предотвратить наследование всех предопределенных способов
// имеющихся у объекта. Это значит, что Хоть какой и ВСЕ характеристики этого объекта должны быть
// определены юзером, что делает этот объект чрезвычайно полезным для сотворения кэш контейнера. // Создание объекта без макета. var safeCache = Object.create(null);

// Давайте поглядим, есть ли какие-то обычные способы в этом объекте. ["hasOwnProperty", "toString", "valueOf", "constructor", "__proto__"]
.forEach(
function iterator(key, index) {
console.log("[ %s ] exists: %s", key, ( key in safeCache ));
}
);
При запуске это скрипта мы получим последующий итог:
[ hasOwnProperty ] exists: false
[ toString ] exists: false
[ valueOf ] exists: false
[ constructor ] exists: false
[ __proto__ ] exists: true
Это дает нам очень близкую возможность, слепо, добавлять, удалять и инспектировать наличие ключей у данного объекта. Как вы видите, все «стандартные» характеристики Object.prototype отсутствуют. Единственное, магическое, свойство которое существует «__proto__». Я предполагаю, что это допустимый уровень риска за возможность очень обычного кода.

1-ый класс — хранилище реализованное на объекте унаследованном от null; 2-ой класс — хранилище реализованное на обыкновенном JavaScript объекте: Что бы узреть что-то конкретное, я попробовал сделать очень обычный кэш класс, инкапсулирующий хранение пар ключ-значение. Естественно, когда я говорю «простой код», отличие не так значительно.
function SaferCache() {

var cache = {};

// Reveal the public API. // —

function get(key) {
if (has(key)) {
return ( cache[key] );
}
}

function has(key) {
return ( cache.hasOwnProperty(key) );
}

function remove(key) {
return ( delete( cache[key] ), this );
}

function set(key, value) {
return ( cache[key] = value, this );
}
}

var saferCache = new SaferCache()
.set("foo", "Bar")
.set("hello", "world")
.set("beep", "boop");

console.log("## Safer Cache ##");
console.log(saferCache.has("foo"));
console.log(saferCache.has("meep"));
console.log(saferCache.has("valueOf"));
console.log(saferCache.has("__proto__")); return ({
get: get,
has: has,
remove: remove,
set: set
});

// —
// PUBLIC METHODS. // В данной версии кэша мы будем применять инкапсулированный
// объект унаследованный от null, и потом, представим, что наименования
// пользовательских ключей кэша будет конфликтовать с именами обычных способов. // —

function get(key) {
return ( cache[key] );
}

function has(key) {
return ( key in cache );
}

function remove(key) {
return ( delete( cache[key] ), this );
}

function set(key, value) {
return ( cache[key] = value, this );
}
}

var safeCache = new SafeCache()
.set("foo", "Bar")
.set("hello", "world")
.set("beep", "boop");

console.log("## Safe Cache ##");
console.log(safeCache.has("foo"));
console.log(safeCache.has("meep"));
console.log(safeCache.has("valueOf"));
console.log(safeCache.has("__proto__"));

// В данной версии кэша мы будем применять классический объект,
// с применением особых мер предосторожности для проверки
// существования способа либо возвращения, определенного юзером, значения. return ({
get: get,
has: has,
remove: remove,
set: set
});

// —
// PUBLIC METHODS. function SafeCache() {

var cache = Object.create(null);

// Reveal the public API.
Раз вы лишь бегло взглянули на этот код, вы могли даже не увидеть различия. Но она там есть, в способах get() и has().

Что бы быть честным, раз вы собираетесь инкапсулировать реализацию кэша, вы могли бы применять самое накрепко — .hasOwnProperty() либо, к примеру, смешанный ключ. И раз ничего из перечисленного, то это просто полезно знать, что вы сможете сделать объект унаследованный от null в JavaScript/Node.js. habrahabr.ru Но раз вы не работает с неполным кэшем, внедрение объекта унаследованного от null может быть разумным способом баланса меж простотой кода и риском.