javascript --- 屬性描述符

從ES5開始,所有的屬性都具備了屬性描述符

var myObject = {a: 2
};Object.getOwnPropertyDescriptor(myObject, "a");
//{
//    value:2,
//    writable: true,    // 可寫
//    enumerable: true,    // 可枚舉
//    configurble: true    // 可配置
//}

定義屬性:(Object.defineProperty):

// Object.defineProperty
var myObject = {};Object.defineProperty(myObject, "a", {value: 2,writable: true,configurable: true,enunmerable: true
});myObject.a;    // 2// 給myObject定義一個a屬性,值為2,可寫、可枚舉、可配置

可寫性(writable):

// writable
Object.defineProperty(myObject, "a", {value: 2,writable: false, // 不可寫configurable: true,enumerable: true
})
myObject.a = 3;
myObject.a;   // 2

可配置(configurable):

// configurable
Object.defineProperty(myObject, "a", {value: 4,writable: true,configurable: false,    // 不可配置enumerable: true
}); 
Object.defineProperty(myObject, "a", {value: 6,writable: true,configurable: true,enumerable: true
});   // TypeError .. 對于confugirable為false的屬性,不允許將其改為truedelete myObject                                                                                                                                                                                                                                                                                                                                                                .a ; // 刪除無效 
myObject.a; // 2 

對象常量:

// 結合writable和configurable創建一個真正的常量屬性
var myObejct = {};
Object.defineProperty(myObject, "FAVORITE_NUMBER", {value: 42,writable: false,configurable: false
});

禁止擴展:

// 禁止一個對象添加新屬性 Object.preventExtensions()
var myObject={a: 2
};
Object.preventExtensions(myObject);myObject.b = 3;
myObject.b; // undefined

Getter:

// getter是一個隱藏函數,會在獲取屬性值時調用
var myObject = {// 給a定義一個getterget a() {return 2;   // 在使用myObject.a時調用,返回2}
};
Object.defineProperty(myObject,"b",{// 給b設置一個getterget function () {return this.a * 2},    // 在使用myObject.b時回返回一個 2*a// 確保B會出現在對象的屬性列表中enumerable: true}
};
myObject.a;  // 2
myObject.b;  // 4

Setter:

// 在調用對屬性的賦值時,觸發
// 一般與getter成對出現
var myObject = {// 給a定義一個getterget a() {return this._a_;},// 給a定義一個setterset a(val) {this._a_ = val * 2;}
};
myObject.a = 2;   // 賦值操作,觸發setter
myObject.a;  // 4  // 讀取操作,觸發getter

檢查對象中的屬性:

// a in object
// hasOwnProperty
var myObject = {a: 2
};
("a" in myObject);  // true
("b" in myObject);  // falsemyObject.hasOwnproperty("a");   // true
myObject.hasOwnproperty("b");   // false// 注: in操作符會檢查屬性是否在對象及其 [[Prototype]]原型鏈中,hasOwnproperty()只會檢查屬性是否在myObject對象中(不會檢查[[Prototype]]鏈).

遍歷:

// forEach()會遍歷數組中的所有值并忽略回調函數的返回值.
// every()會一直運行直到回調函數返回false
// some()會一直運行直到回調函數返回true
// for...in遍歷對象是無法直接獲取屬性值的,因為它實際上遍歷的是對象中的所有可枚舉屬性,你需要手動獲取屬性值.// ES6新增for...of循環語法,來直接遍歷值:
var myArray = [1, 2, 3];
for(var v of myArray) {console.log(v);
}// 可以使用數組內置的@@iterator來看看它是如何工作的:
var myArray = [1, 2, 3];
var it = myArray[Symbol.iterator]();
console.log(it.next());   // {value: 1,done: false }
console.log(it.next());   // {value: 2,done: false }
console.log(it.next());   // {value: 3,done: false }
console.log(it.next());   // {done: true}

自定義迭代器:

// 給任何你想遍歷的對象定義@@iterator,
var myObject = {a: 2,b: 3
};
Object.defineProperty( myObject, Symbol.iterator,{enumerable: false,  // 不可枚舉writable: false,  // 不可寫configurable: true, // 可配置value: function() {var o = this;  // this指代myObject.[{a:2},{b:3}]var idx = 0;var ks = Object.keys(o); // 獲取元素值[2,3]return {next: function() {   // 返回一個next()方法. 使用obj.next()調用. 返回值和是否完成.return {value: o[ks[idx++]],done: (idx > ks.length)};}};}
});
// 手動遍歷myObject
var it = myObject[Symbol.iterator]();
it.nexr();   // {value: 2, done: false}
it.next();   // {value: 3, done: false}
it.next();   // {value: undefined, done: true}// 用for...of遍歷myObject
for(var v of myObject) {console.log(v);
}

參考《你不知道的JavaScript》(上卷)P111~P124

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251240.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251240.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251240.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

看了嗎網址鏈接

sklearn實戰-乳腺癌細胞數據挖掘(博主親自錄制視頻) https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare # -*- coding: utf-8 -*- ""&qu…

JMeter 性能測試進階實戰

課程簡介 本課程制作的主要目的是為了讓大家快速上手 JMeter,期間穿插了大量主流項目中用到的技術,以及結合當今主流微服務技術提供了測試 Dubbo 接口、Java 工程技術具體實施方案,注重實踐、注意引導測試思維、拒絕枯燥的知識點羅列、善于用…

javascript --- 混入

顯示混入: function mixin(sourceObj, targetObj){for(var key in sourceObj){ // 遍歷source中的所有屬性if(!(key in targetObj)) { // 找到targetz中沒有的屬性targetObj[key] sourceObj[key];}}return targetObj; }var Vehicle {engines: 1,iginition: function() {c…

php源碼代目錄

ext :存放動態和內建模塊的目錄,在這里可以找到所有的php官方虧站,并且也可以在這里編寫擴展; main:包含php的主要宏定義; pear: PHP擴展與應用庫; sapi:包含不同服務器抽象層的代碼; TSRM:Zend和PHP的"線程安全資源管理器"目錄; Z…

bzoj1231 [Usaco2008 Nov]mixup2 混亂的奶牛——狀壓DP

題目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id1231 小型狀壓DP&#xff1b; f[i][j] 表示狀態為 j &#xff0c;最后一個奶牛是 i 的方案數&#xff1b; 所以下一個只能是和它相差大于 k 而且不在狀態中的奶牛。 代碼如下&#xff1a; #include<iostr…

JavaScript高級程序設計閱讀筆記

2020-11-15 通過初始化指定變量類型 數字-1 對象null和null的比較&#xff08;不理解&#xff09;使用局部變量將屬性查找替換為值查找&#xff08;算法復雜度&#xff09;循環的減值迭代&#xff0c;降低了計算終止條件的復雜度switch快多個變量聲明逗號隔開使用數組和對象字面…

jquery --- 監聽input框失效

使用juery監聽Input輸入的變化,并且封裝起來,如下: // html <input type"text" id‘myinput1’ /> // js function formOnById(id){let dom # id;$(dom).bind(input propertychange,()>{let item $(dom).val;console.log(item);} } formOnById(myinp…

windows任務計劃程序 坑

轉載于:https://www.cnblogs.com/kaibindirver/p/8109041.html

第三篇:函數之嵌套

1 #函數的嵌套調用&#xff1a;在調用一個函數的時&#xff0c;其內部的代碼又調用其他的函數2 # def bar():3 # print(from bar)4 #5 # def foo():6 # print(from foo)7 # bar()8 #9 # foo() 10 11 12 # def max2(x,y): 13 # if x > y: 14 # ret…

vue路由權限(結合服務端koa2)

gitee地址 一、項目初始化 vue create manager-admin // 創建vue項目// 管理員權限安裝 cnpm i -S koa2 // 下載koa2依賴 cnpm install --global koa-generator // 下載框架 koa-generator koa2 manager-server // 創建項目 cd manager-server // 進入項目 npm install // 安…

javascript --- 類、class、事件委托的編程風格

類風格: // 父類 function Widget(width, height) {this.width width || 50;this.height height || 50;this.$elem null; } Widget.prototype.render function($where) {if(this.$elem) {this.$elem.css({width: this.width "px",height: this.height "p…

在線獲取UUID

http://fir.im/udid轉載于:https://www.cnblogs.com/mtjbz/p/8116576.html

堆和堆排序

堆和優先隊列 普通隊列&#xff1a;FIFO&#xff0c;LILO 優先隊列&#xff1a;出隊順序和入隊順序無關&#xff0c;和優先級相關。一個典型應用就是操作系統中。動態選擇優先級高的任務執行 堆的實現 最典型的堆就是二叉堆&#xff0c;就像是一顆二叉樹。這個堆的特點&#xf…

ES5-1 發展史、ECMA、編程語言、變量、JS值

1. 5大主流瀏覽器及內核&#xff08;自主研發&#xff09; 瀏覽器內核IEtridentChromewebkit blinkSafariwebkitFirefoxgeckoOperapresto 2. 瀏覽器的歷史 和 JS誕生 1989-1991 WorldWideWeb&#xff08;后來為了避免與萬維網混淆而改名為Nexus&#xff09;是世界上第一個網頁…

javascript --- 使用對象關聯簡化整體設計

在某個場景中,我們有兩個控制器對象: 1.用來操作網頁中的登錄表單; 2.用來與服務器進行通信. 類設計模式 // 把基礎的函數定義在名為Controller的類中,然后派生兩個子類LoginController和AuthController. // 父類 function Controller() {this.errors []; } Controller.prot…

javascript --- polyfill中幾個常用方法

ES6中,新增了許多有用的方法,下面分享幾個ES6之前得版本寫的polyfill Number.EPSILON: // 機器精度,并判斷2個數是否相等 if(!Number.EPSILON){Number.EPSILON math.pow(2, -52); }function numberCloseEnoughToEqual(n1, n2) {return Math.abs(n1 - n2 ) < Number.EPSIL…

[Usaco2010 Nov]Visiting Cows

題目描述 經過了幾周的辛苦工作,貝茜終于迎來了一個假期.作為奶牛群中最會社交的牛,她希望去拜訪N(1<N<50000)個朋友.這些朋友被標號為1..N.這些奶牛有一個不同尋常的交通系統,里面有N-1條路,每條路連接了一對編號為C1和C2的奶牛(1 < C1 < N; 1 < C2 < N; C1…

ES5-2 語法、規范、錯誤、運算符、判斷分支、注釋

1. 錯誤 MDN錯誤列表 Uncaught SyntaxError: Unexpected token ) // 語法錯誤 Uncaught ReferenceError: a is not defined // 引用錯誤等類型 Uncaught TypeError: Cannot read property toString of null出現一個語法錯誤&#xff0c;則一行代碼都不會執行&#xff08;檢查…

新單詞 part 4

part 41.veto 英[?vi:t??]美[?vi:to?]n. 行使否決權; 否決權&#xff0c;否認權; 否決理由;vt. 否決&#xff0c;不同意; 不批準&#xff0c;禁止;vi. 否決; 禁止;2.acoustics 英[??ku:st?ks]美[??kust?ks]n. 聲學; &#xff08;傳聲系統的&#xff09; 音響效果; 聲…

unity深度查找某個子物體和遍歷所有子物體方法

本文總結一下關于unity的查找子物體的方法 首先說明一下這里將講三種查找子物體方法&#xff1a; 查找固定路徑的某一個子物體的方法、通過名字深度查找某個子物體的方法、查找父物體下所有子物體的方法。 第一:查找固定路徑的某一個子物體的方法 對于已知的路徑可以直接用go.t…