簡體   English   中英

使用get&set將值添加到對象文字的屬性中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM