[英]Using object literal notation to set a property's value in terms of another property
[英]add value to the property of an object literal using get & set
在這里,我有一個名為myobj的對象,它只有一個屬性是“年齡”。 我想使用object.defineProperty()的get和set方法添加另一個名為'name'的屬性。但是我必須為此使用一個變量。這意味着該變量保存了傳遞給'set'方法的值,而不是myobj.name本身.console.dir(myobj)同時顯示myobj對象的age和name屬性,並且該值已分配給myobj.name屬性。但是,如果變量保留該值,則如何將其分配給myobj。名稱屬性?
var myobj={age:2};
(function(){
var name;
Object.defineProperty(myobj,'name',
{
enumerable:true,
get:function(){
return name;
},
set:function(val){
name=val;
}
});
myobj.name='jack';
})();
for(i in myobj){
console.log(myobj[i]);
}
console.dir(myobj);
但是,如果變量保存該值,那么如何將其分配給myobj.name屬性?
它沒有分配給myobj.name
,但是console.dir()
枚舉了所有屬性,包括您已定義的屬性(由變量支持)。
要使用.defineProperty()
創建私有屬性,您可以像這樣:
function Foo(age) { var name = 'jack'; this.age = age; Object.defineProperty(this, 'name', { enumerable:true, get: function() { return name; }, set: function(val) { name=val; } }); } var f = new Foo(33); alert(f.name); // "jack"
盡管除非enumerable為true,否則該屬性不會出現在for..in
循環中,但console.dir()
可能不接受該設置(例如Chrome)。
為了回答您的問題,它是特定於實現的。 所有的javascript引擎都會做不同的事情。 就像在Chrome中一樣,將有一個C ++代碼與您的設置程序進行交互,並且使用getter神奇地使這些事情起作用。
這是一個很好的例子說明其工作原理的原因。 這樣,DOM元素被屏蔽,因此它使獲取和設置它的方式更短。 我已經將name
變量更改為input元素來演示這一點。
<!DOCTYPE html>
<html>
<head>
<body>
<input type="text" id="getset">
<script>
var myobj={age:2};
(function(){
var name = document.getElementById('getset');
Object.defineProperty(myobj,'name',
{
enumerable:true,
get:function(){
return name.value;
},
set:function(val){
name.value=val;
}
});
name.addEventListener('click', function(){
myobj.name = 'clicked jack';
console.log(myobj.name);
});
myobj.name='jack';
})();
for(i in myobj){
console.log(myobj[i]);
}
console.dir(myobj);
</script>
</body>
</html>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.