getSomeProperty()/setSomeProperty(...)
methods, but about a more interesting implementation - pseudo-attributes, which, when changed, will call handler functions.function MyObject(newVal) {
this ._secretProperty = newVal;
}
MyObject.prototype = {
getSecretProperty: function () {
return this ._secretProperty;
},
setSecretProperty: function (newVal) {
return this ._secretProperty = newVal;
}
}
* This source code was highlighted with Source Code Highlighter .
this
, we will not hide it from the “evil hacker”. And you can do this:var obj = new MyObject();
obj._secretProperty = '-! - , !' ;
// setSecretProperty. -- :)
* This source code was highlighted with Source Code Highlighter .
function MyObject(newVal) {
var _secretProperty = newVal;
this .getSecretProperty = function () {
return _secretProperty;
}
this .setSecretProperty = function (newVal) {
return _secretProperty = newVal;
}
}
* This source code was highlighted with Source Code Highlighter .
this ._secretProperty
already undefined
. Get a malicious hacker!var obj = new MyObject(42);
alert(obj._secretProperty); // undefined
alert(obj.getSecretProperty()); // 42
obj._secretProperty = 9;
alert(obj._secretProperty); // 9 - ...
alert(obj.getSecretProperty()); // 42 - , ! :-)
obj.setSecretProperty(78);
alert(obj.getSecretProperty()); // 78
* This source code was highlighted with Source Code Highlighter .
getSomeProperty()/setSomeProperty(...)
approach is too cumbersome. You can do much more concisely, and at the same time save PC memory and the time of developers who will later use it:function MyObject(newVal) {
var _secretProperty = newVal;
/**
* @param {Object} newVal - _secretProperty. .
* , secretProperty(...) , setter.
* , secretProperty() , getter.
*/
this .secretProperty = function (newVal) {
if ( typeof newVal != "undefined" )
_secretProperty = newVal;
return _secretProperty;
}
}
// :
var obj = new MyObject(42);
alert(obj._secretProperty); // undefined
alert(obj.secretProperty()); // 42
obj.secretProperty(78);
alert(obj.secretProperty()); // 78
* This source code was highlighted with Source Code Highlighter .
var obj = {
real_a: 1
};
// , DOM, (, IE ) :
// __defineGetter__, __defineSetter__, __lookupGetter__, __lookupSetter__
// getter' setter':
obj.__defineGetter__( "a" , function () { return this .real_a * 2; });
obj.__defineSetter__( "a" , function (v) { return this .real_a = v / 2; });
// getter' setter':
alert(obj.__lookupGetter__( 'a' )) // some function-getter for 'a'
alert(obj.__lookupGetter__( 'b' )) // undefined
alert(obj.__lookupSetter__( 'a' )) // some function-setter for 'a'
//
alert(obj.real_a); // 1
obj.a = 9; // setter
alert(obj.real_a); // 4.5
alert(obj.a); // 9; getter
* This source code was highlighted with Source Code Highlighter .
var obj = {attr:5};
obj.__defineSetter__( 'attr' , function (val){
// :
// this.attr = val * 5
// .. setter.
// :
this .v = val * 5;
})
alert(obj.attr); // undefined. , getter/setter "" , .
// - - -.
// , setter 'attr', getter.
obj.attr = 3; // setter :)
alert(obj.v); // 15. setter .
* This source code was highlighted with Source Code Highlighter .
var obj = {
real_a: 1,
get a() { return this .real_a * 2; },
set a(v) { return this .real_a = v / 2; }
};
//
alert(obj.real_a); // 1
obj.a = 9; // setter
alert(obj.real_a); // 4.5
alert(obj.a); // 9; getter
// __lookupGetter__/__lookupSetter__ - :
alert(obj.__lookupGetter__( 'a' )) // some function-getter for 'a'
// ..
* This source code was highlighted with Source Code Highlighter .
var obj = {
get ab() { /**/ },
set ac(v) { /**/ }
};
alert(obj.__lookupGetter__( 'a' )) // function b()
alert(obj.__lookupSetter__( 'a' )) // function c(v)
// ..
* This source code was highlighted with Source Code Highlighter .
function magicGetter() { return 42; };
var obj = {
a getter: function b() { /**/ },
a setter: function (v) { /**/ },
'^_^' getter: magicGetter
};
alert(obj.__lookupGetter__( 'a' )) // function b()
alert(obj.__lookupSetter__( 'a' )) // function(v)
alert(obj.__lookupGetter__( '^_^' )) // function magicGetter()
alert(obj[ "^_^" ]); // 42
* This source code was highlighted with Source Code Highlighter .
Object.defineProperty(...)
method is implemented Object.defineProperty(...)
But, Object.defineProperty(...)
, it is applicable only to DOM elements.// IE 8.0
Object.defineProperty( document .body, "description" , {
get : function () {
alert( 'Getting description...' );
return this .desc;
},
set : function (val) {
alert( 'Setting description...' );
this .desc = val;
}
});
document .body.description = "Content container" ; // "Setting description..."
alert( document .body.description); // "Getting description..." -> "Content container"
alert( document .body.desc); // "Content container"
// DOM-:
var obj = {};
Object.defineProperty(obj, "prop" , {
get : function () { /**/ }
}); // JS ERROR: Object doesn't support this action. -. .
* This source code was highlighted with Source Code Highlighter .
onpropertychange
. It is present only in DOM elements. With it you can create a setter. However, for the getters, I never found anything. Example:document .body.onpropertychange = function () {
var pn = window. event .propertyName;
var pv = window. event .srcElement[window. event .propertyName];
if (pn == "description" )
alert(pv);
}
document .body.description = "Content container" ; // setter alert "Content container"
alert( document .body.description); // "Content container". getter. description
// DOM- onproperychange
var el = document .createElement( "DIV" );
el.onpropertychange = function () {
var pn = window. event .propertyName;
var pv = window. event .srcElement[window. event .propertyName];
if (pn == "description" )
alert(pv);
}
el.description = "Content container" ; // . , ...
// DOM-:
document .appendChild(el);
el.description = "Content container" ; // setter alert "Content container"
* This source code was highlighted with Source Code Highlighter .
Object.defineProperty
:Source: https://habr.com/ru/post/66242/
All Articles