Вы можете использовать Object.freeze(o);
, чтобы сделать объект неизменным в новых браузерах.
Таким образом, Point2D
может быть реализовано так:
var Point2D = function(x, y) {
this.x = x;
this.y = y;
Object.freeze(this);
}
Теперь никакие новые свойства не могут быть добавлены к объекту Point2D
, и его существующие свойства не могут быть изменены:
> var p = new Point2D(99, 123)
undefined
> p.x
99
> p.x = 7
7
> p.x
99
> p.foo = "This won't be added"
undefined
> JSON.stringify(p);
"{"x":99,"y":123}"
Если вы хотите заблокировать объект только для того, чтобы не было добавлено каких-либо новых свойств, вы можете использовать Object.seal(o);
. Это позволит вам изменять существующие свойства, но не добавлять новые.
> var o = {x:1, y:2}
undefined
> Object.seal(o);
[object Object]
> JSON.stringify(o);
"{"x":1,"y":2}"
> o.foo = "This won't be added";
99
> o.x = 37 // Seal allows to mutate object
37
JSON.stringify(o);
"{"x":37,"y":2}"
freeze
и seal
является частью ECMAScript 5.1 , который более формально описан здесь
MDN утверждает, что freeze
поддерживается в:
- Firefox (Gecko) 4 (2.0)
- Chrome 6
- Internet Explorer 9
- Опера 12
- Safari 5.1
Кроме того, вы можете использовать более функциональный стиль кодирования:
var Point2D = function(x, y) {
return function(prop) {
switch (prop) {
case "x": return x;
case "y": return y;
default: throw new Error("Property '" + prop + "' not supported");
}
};
}
Использование тогда будет таким:
> var p = Point2D(1,2)
undefined
> p("x")
1
> p("y")
2
> p("foo")
Error: Property 'foo' not supported
Я не знаю способа изменить «свойства» x
и y
, используя этот подход, поскольку они связаны с областью действия Point2D
. Этот подход обычно не встречается в javascript (насколько я знаю), но он похож на то, как передача сообщений / OO может быть достигнута, например, в Scheme.