Динамическое свойство объекта JavaScript? - PullRequest
4 голосов
/ 18 ноября 2009

Мне интересно, если это возможно в JavaScript, я хочу иметь объект, который может содержать динамические свойства.

Приведите пример:

function MyObject()
{
}

var myobj = new MyObject();
myobj.property1 = "something";

alert(myobj.property1); // something
alert(myobj.property2); // this should never report error, instead the property should be evaluated to null, as it has never been set. 

Есть ли способ перехватить вызовы свойств в JavaScript, чтобы я мог предварительно установить свойство без значения как нулевое?

Спасибо.

Ответы [ 8 ]

4 голосов
/ 31 октября 2015

«Прокси» может сделать это

var myobj = new Object();
var handler = {
    get:function (obj, name, proxyed){
        if(obj[name] !== undefined) // if obj[name] exist
            return obj[name];       // then return obj[name]
        return null; // if obj[name] is not exist then return null;
    }
};
var obj = new Proxy(myobj, handler);
obj.property1 = "something";

alert(myobj.property1); // something
alert(myobj.property2); // undefined

alert(obj.property1); // something
alert(obj.property2); // null
4 голосов
/ 18 ноября 2009

Это как можно ближе к достижению вашей цели.

Код:

var obj = {};
alert("prop: " + obj.prop);
obj.prop = "something";
alert("prop: " + obj.prop);
delete obj.prop;
alert("prop: " + obj.prop);

Поведение:

Alert: "prop: undefined"
Alert: "prop: something"
Alert: "prop: undefined"
2 голосов
/ 18 ноября 2009

Да, но только в версии 2.0 и выше. Точный синтаксис все еще не определен, но похоже, что он будет get * () {...} для литералов объекта, по крайней мере.

1 голос
/ 18 ноября 2009

Нет способа перехватить прямой доступ к свойству в JavaScript. Когда извлекается свойство, которое не было установлено, результатом будет undefined. Хотя null и undefined обычно считаются одной и той же вещью, на самом деле это разные сущности.

В JavaScript undefined означает отсутствие значения, а null означает нулевое значение. В некоторых случаях вы можете смешивать undefined и null Например, при использовании оператора == они эквивалентны ((null == undefined) === true). Используя оператор без принуждения, ===, они различаются ((null === undefined) === false).

Вы можете использовать это в своих интересах. В то время как большинство людей будут утверждать, что вы должны использовать оператор равенства без принуждения (===), в большинстве случаев безопасно помещать null и undefined в одно и то же ведро, но в меньшей степени вы действительно заботитесь о разнице между двумя , Хитрость заключается в том, что undefined является свойством глобального объекта и поэтому ему может быть присвоено новое значение.

Если кто-то скажет undefined = 'donkey', тогда null == undefined начнет возвращаться false. На практике это почти никогда не является проблемой, поскольку большинство людей недостаточно глупы, чтобы переназначить значение undefined.

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

1 голос
/ 18 ноября 2009

Неа. JavaScript не является Smalltalk.

0 голосов
/ 18 ноября 2009

В вашем примере второе предупреждение не будет выдавать ошибку. Это просто предупредит undefined. Доступ к свойствам свойств приведет к ошибке:

myobj.property2.property3
0 голосов
/ 18 ноября 2009

Проверьте прототипы JavaScript. Я думаю, что это даст вам по крайней мере немного того, что вы ищете. Просто погуглите "прототип javascript".

0 голосов
/ 18 ноября 2009

Нет, если вы не управляете объектом, управляемым плагином NPAPI, в этом случае вы можете реализовать намеченное поведение.

Другими словами, с помощью плагина NPAPI вы можете реализовать искомое поведение.

...