成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript Object.defineProperty()學(xué)習(xí)筆記。

lushan / 1947人閱讀

摘要:數(shù)據(jù)屬性有個(gè)描述其行為的特性。表示能否通過刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。表示能否修改屬性的值。其中,描述符對(duì)象的屬性必須是和。返回值被傳遞給函數(shù)的對(duì)象。

屬性類型

ECMAScript中有兩種屬性:數(shù)據(jù)屬性和訪問器屬性。
數(shù)據(jù)屬性:
數(shù)據(jù)屬性包含一個(gè)數(shù)據(jù)值的位置。在這個(gè)位置可以讀取和寫入值。數(shù)據(jù)屬性有4個(gè)描述其行為的特性。

[[Configurable]]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。在對(duì)象上直接定義的屬性,它們的這個(gè)特性默認(rèn)值為true。
[[Enumerable]]:表示能否通過for-in循環(huán)返回屬性。在對(duì)象上直接定義的屬性,它們的這個(gè)特性默認(rèn)值為true。
[[Writable]]:表示能否修改屬性的值。在對(duì)象上直接定義的屬性,它們的這個(gè)特性默認(rèn)為true.
[[Value]]:包含這個(gè)屬性的數(shù)據(jù)值。讀取屬性值的時(shí)候,從這個(gè)位置讀;寫入屬性值的時(shí)候,把新值保存在這個(gè)位置。這個(gè)特性的默認(rèn)值為undefined。

要修改屬性默認(rèn)的特性,必須使用ECMAScript5的Object.defineProperty()方法。這個(gè)方法接受三個(gè)參數(shù):屬性所在的對(duì)象、屬性的名字和一個(gè)描述符對(duì)象。其中,描述符對(duì)象的屬性必須是:configurable、enumerable、writable和value。設(shè)置其中的一個(gè)或多個(gè)值,可以修改對(duì)應(yīng)的特性值。例如:

var person = {};
Obejct.defineproperty(person,"name",{
    writable:false,
    value:"Nics"
})
console.log(person.name)//Nics
person.name = "tom";
console.log(person.name)//Nics

這個(gè)例子創(chuàng)建了一個(gè)明為name的屬性,它的值是只讀的,如果為它指定新的值,在非嚴(yán)格模式下,賦值操作將被忽略;在嚴(yán)格模式下賦值操作將會(huì)拋出錯(cuò)誤。
如果把configurable設(shè)置為false,表示不能從對(duì)象中刪除屬性,而且一旦把屬性定義為不可配置的,就不能再把它變?yōu)榭膳渲昧?。此時(shí)再調(diào)用Object.defineProperty()方法修改writable之外的特性都會(huì)拋出錯(cuò)誤。
也就是說,可以多次調(diào)用Object.defineProperty()方法修改同一個(gè)屬性,但在把configurable特性設(shè)置為false之后就會(huì)有限制了。
再調(diào)用Object.defineProperty()方法創(chuàng)建一個(gè)新的屬性的時(shí)候,如果不指定configurable、enumerable、writable特性的默認(rèn)值都是false。
Obejct.defineProperty(obj,prop,descriptor)方法會(huì)直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)對(duì)象的現(xiàn)有屬性,并返回這個(gè)對(duì)象。
參數(shù):

obj:要在其上定義屬性的對(duì)象。
prop:要定義或修改的屬性的名稱。
descriptor:將被定義或修改的屬性描述符。

返回值:

被傳遞給函數(shù)的對(duì)象。

屬性描述符:

configurable:當(dāng)且僅當(dāng)改屬性的configurable為true時(shí),該屬性描述符才能夠被改變,同時(shí)該屬性也能從對(duì)應(yīng)的對(duì)象上被刪除。默認(rèn)為false。
enumerable:當(dāng)且僅當(dāng)改屬性的enumerable為true時(shí),改屬性才能夠出現(xiàn)在對(duì)象的枚舉屬性中。默認(rèn)為false。
數(shù)據(jù)描述符同時(shí)具有以下可選鍵值:
value:該屬性對(duì)應(yīng)的值。可以是任何有效的JavaScript值(數(shù)值,對(duì)象,函數(shù)等)。默認(rèn)為undefined。
writable:當(dāng)且僅當(dāng)該屬性的writable為true時(shí),value才能被賦值運(yùn)算符改變。默認(rèn)為false。
存取描述符同時(shí)具有以下可選鍵值:
get:一個(gè)給屬性提供getter的方法,如果沒有g(shù)etter則為undefined。當(dāng)訪問改屬性時(shí),該方法會(huì)被執(zhí)行,方法執(zhí)行時(shí)沒有參數(shù)傳入,但是會(huì)傳入this對(duì)象(由于繼承關(guān)系,這里的this并不一定是定義該屬性的對(duì)象)默認(rèn)為undefined。
set:一個(gè)給屬性提供setter的方法,如果沒有setter則為undefined。當(dāng)屬性值修改時(shí),觸發(fā)執(zhí)行該方法。該方法將接受唯一參數(shù),即改屬性新的參數(shù)值。
var o = {}
//在對(duì)象中添加一個(gè)屬性與數(shù)據(jù)描述符的示例。
Obejct.defineProperty(o,"a",{
    value:37,
    writable:true,
    enumerable:true,
    configurable:true
})
//對(duì)象o擁有了屬性a,值為37

//在對(duì)象中添加一個(gè)屬性與存取描述符的示例。
var bValue;
Obejct.defineProperyty(o,"b",{
    get:function(){
        return bValue;
    },
    set:function(newValue){
        bValue = newValue;
    },
    enumerable:true,
    configurable:true
})
o.b = 38;
//對(duì)象o擁有了屬性b,值為38.
//數(shù)據(jù)描述符和存取描述符不能混合使用。

一般的Setters和Getters
下面的例子展示了如何實(shí)現(xiàn)一個(gè)自存檔對(duì)象。當(dāng)設(shè)置temperature屬性時(shí),archive數(shù)組會(huì)獲取日志條目。

function Archiver(){
    var temperatrue = null;
    var aechive = [];
    Obejct.defineProperty(this,"temperatrue",{
        get:function(){
            console.log("get!");
            return temperature;
        },
        set:function(value){
            temperature = value;
            archive.push({val:temperature})
        }
    });
    this.getArchive = function(){return archive}
}
var arc = new Archiver();
arc.temperature;//"get!";
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive();//[{val:11},{val:13}]

或:

var pattern = {
    get:function(){
        return "I alway return this string,whatever you have assigned"
    },
    set:function(){
        this.myname = "this is my name string"
    }
}
function TestDefineSetAndGet(){
    Object.defineProperty(this,"myproperty",pattern);
}
var instance = new TestDefineSetAndGet();
instance.myproperty = "test";
console.log(instance.myproperty);
console.log(instance.myname)

如果訪問者的屬性是被繼承的,他的get和set方法會(huì)在子對(duì)象的屬性被訪問或者修改時(shí)被調(diào)用。如果這些方法用一個(gè)變量存值,該值會(huì)被所有對(duì)象共享。

function myclass(){}
var value;
Obejct.defineProperty(myclass.prototype,"x",{
    get(){
        return value;
    },
    set(x){
        value = x;
    }
})
var a = new myclass();
var b = new myclass();
a.x=1;
console.log(b.x);//1

在get和set方法中,this指向某個(gè)被訪問和修改屬性的對(duì)象。

function myclass(){}
Obejct.defineProperty(myclass.prototype,"x",{
    get(){
        return this.stored_x;
    },
    set(x){
        this.stored_x = x;
    }
});
var a = new myclass();
var b = new myclass();
a.x=1;
console.log(b.x)//undefined

不像訪問者屬性,值屬性始終在對(duì)象自身上設(shè)置,而不是一個(gè)原型。然而,如果一個(gè)不可寫的屬性被繼承,它仍然可以防止修改對(duì)象的屬性。

function myclass() {
}
myclass.prototype.x = 1;
Object.defineProperty(myclass.prototype, "y", {
  writable: false,
  value: 1
});
var a = new myclass();
a.x = 2;
console.log(a.x); // 2
console.log(myclass.prototype.x); // 1
a.y = 2; // Ignored, throws in strict mode
console.log(a.y); // 1
console.log(myclass.prototype.y); // 1

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102797.html

相關(guān)文章

  • 對(duì)象管理器(defineProperty學(xué)習(xí)筆記

    摘要:通過設(shè)置我們可以將一些屬性鎖定,來防止別人的修改,這是一種防御編程形式,就像語(yǔ)言的內(nèi)置對(duì)象一樣不過的內(nèi)置對(duì)象都可以被隨意更改??梢允褂脕砼袛嗄骋粋€(gè)屬性是否可以枚舉。 對(duì)象管理器(defineProperty) 在 JavaScript 里面聲明一個(gè)變量,通常我們有三種方式可以實(shí)現(xiàn): let person = {} // 對(duì)象字面量 let cat = new Objec...

    mist14 評(píng)論0 收藏0
  • 《你不知道的javascript筆記_對(duì)象&原型

    摘要:上一篇你不知道的筆記寫在前面這是年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響年是向上的一年在新的城市穩(wěn)定連續(xù)堅(jiān)持健身三個(gè)月早睡早起游戲時(shí)間大大縮減,學(xué)會(huì)生活。 上一篇:《你不知道的javascript》筆記_this 寫在前面 這是2019年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響2018年是向上的一年:在新的城市穩(wěn)定、...

    seasonley 評(píng)論0 收藏0
  • JavaScript學(xué)習(xí)第七天筆記(面向?qū)ο螅?/b>

    摘要:面向?qū)ο蟾攀雒嫦驅(qū)ο缶幊痰娜Q是簡(jiǎn)稱為。面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建給予現(xiàn)實(shí)世界模型的一種編程模式。構(gòu)造函數(shù)構(gòu)造函數(shù)又被稱為構(gòu)造器或?qū)ο竽0澹莿?chuàng)建對(duì)象的一個(gè)方法。 面向?qū)ο?概述 面向?qū)ο缶幊痰娜Q是Object Oriented Programming,簡(jiǎn)稱為OOP。面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建給予現(xiàn)實(shí)世界模型的一種編程模式。面向?qū)ο缶幊炭梢悦嫦驅(qū)ο缶幊痰娜齻€(gè)主要特征是:1.封裝 ...

    Tychio 評(píng)論0 收藏0
  • JavaScript學(xué)習(xí)筆記整理:對(duì)象篇

    摘要:函數(shù)式對(duì)象的一個(gè)子類型,中的函數(shù)是一等公民內(nèi)置對(duì)象中還有一些對(duì)象子類型,通常被稱為內(nèi)置對(duì)象。內(nèi)容對(duì)象的內(nèi)容是由一些存儲(chǔ)在特定命名位置的任意類型的值組成的,我們稱之為屬性。 語(yǔ)法 對(duì)象兩種定義形式 聲明(文字)形式 構(gòu)造形式 //聲明(文字)形式 var myObj = { key: value // ... } //構(gòu)造形式 var myObj = new Ob...

    testbird 評(píng)論0 收藏0
  • javascript高級(jí)程序設(shè)計(jì)》筆記:對(duì)象數(shù)據(jù)屬性和訪問器屬性

    摘要:枚舉對(duì)象的屬性第二種情況設(shè)置為,可以被枚舉。內(nèi)置對(duì)象訪問器屬性方法介紹摘自方法返回指定對(duì)象上一個(gè)自有屬性對(duì)應(yīng)的屬性描述符。對(duì)象中存在的屬性描述符主要有數(shù)據(jù)描述符和訪問器描述符兩種返回傳遞給函數(shù)的對(duì)象參考中的 1. 什么是對(duì)象 對(duì)象是無(wú)序?qū)傩缘募?創(chuàng)建自定義對(duì)象最簡(jiǎn)單的方式就是以字面量的形式創(chuàng)建對(duì)象(或創(chuàng)建一個(gè)Object實(shí)例),然后再為它添加屬性和方法,如下所示: var perso...

    mating 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<