摘要:屬性特性每個(gè)屬性與之相關(guān)的值可寫可枚舉可配置對(duì)象特性原型類擴(kuò)展標(biāo)記三類對(duì)象內(nèi)置對(duì)象由規(guī)范定義的對(duì)象或類宿主對(duì)象由解釋器所嵌入的宿主環(huán)境定義的自定義對(duì)象由運(yùn)行中的代碼創(chuàng)建的對(duì)象兩類屬性自有屬性直接在對(duì)象中定義的屬性繼承屬性在對(duì)象的原型對(duì)象中
屬性特性(property attribute):每個(gè)屬性與之相關(guān)的值:
可寫(writable attribute);
可枚舉(enumerable attribute);
可配置(configurable attribute);
對(duì)象特性(object attribute):
原型(prototype);
類(class);
擴(kuò)展標(biāo)記(extensible flag);
三類js對(duì)象:
內(nèi)置對(duì)象(native object):由ECMAScript規(guī)范定義的對(duì)象或類;
宿主對(duì)象(host object):由js解釋器所嵌入的宿主環(huán)境定義的;
自定義對(duì)象(user-defined object):由運(yùn)行中的js代碼創(chuàng)建的對(duì)象
兩類屬性:
自有屬性(own property):直接在對(duì)象中定義的屬性;
繼承屬性(inherited property):在對(duì)象的原型對(duì)象中定義的屬性;
1 創(chuàng)建對(duì)象三種方法:直接量;new和Object.create()函數(shù);
1.1 對(duì)象直接量語(yǔ)法:
var o = {};1.2 通過(guò)new創(chuàng)建對(duì)象
語(yǔ)法:
var o = new Object();1.3 原型
通過(guò)Object.prototype獲得對(duì)原型對(duì)象的引用
1.4 Object.create()第一個(gè)參數(shù)是這個(gè)對(duì)象的原型;第二個(gè)可選參數(shù)是對(duì)對(duì)象的屬性進(jìn)行進(jìn)一步描述
//創(chuàng)建一個(gè)普通的空對(duì)象 var o = Object.create(Object.prototype);2 屬性的查詢和設(shè)置
[]和.
2.1 作為關(guān)聯(lián)數(shù)組的對(duì)象JavaScript對(duì)象都是關(guān)聯(lián)數(shù)組(字典、映射、散列等)
2.2 繼承[暫跳]
2.3 屬性訪問(wèn)錯(cuò)誤當(dāng)訪問(wèn)不存在的對(duì)象的屬性就會(huì)報(bào)錯(cuò),可以通過(guò)下面方法避免出錯(cuò):
var book = {}; var len; if (book.subtitle) { len = book.subtitle.length; } console.log(len); //undefined //或者 var book = {subtitle:"toJSON"}; var len; len = book && book.subtitle && book.subtitle.length; //&&運(yùn)算符的短路行為 console.log(len); //6 //當(dāng)左操作數(shù)是真值時(shí),“&&”運(yùn)算符將計(jì)算右操作數(shù)的值并將其返回作為整個(gè)表達(dá)式的計(jì)算結(jié)果2.4 刪除屬性
delete運(yùn)算符不能刪除繼承屬性
3 檢測(cè)屬性5種方法:
in運(yùn)算符,檢測(cè)自有屬性和繼承屬性
var o = {name:"Oliver",age:18,nothing:undefined}; console.log("name" in o); //True console.log("toString" in o); //True console.log("nothing" in o); //True
hasOwnProperty方法,檢測(cè)自有屬性
var o = {name:"Oliver",age:18,nothing:undefined}; console.log(o.hasOwnProperty("toString")); //False console.log(o.hasOwnProperty("name")); //True
propertyIsEnumerable方法,檢測(cè)自有可枚舉的屬性
var o = {name:"Oliver",age:18,nothing:undefined}; console.log(o.propertyIsEnumerable("toString")); //False console.log(o.propertyIsEnumerable("name")); //True
"!=="方法,檢測(cè)屬性是否為undefined
var o = {name:"Oliver",age:18,nothing:undefined}; console.log(o.name !== undefined); //True console.log(o.nothing !== undefined); //False
有一種場(chǎng)景只能使用in運(yùn)算符。in可以區(qū)分不存在的屬性和存在但是值為undefined的屬性:
var o = {name:"Oliver",age:18,nothing:undefined}; console.log("nothing" in o); //True console.log(o.nothing !== undefined); //False delete o.nothing; console.log("nothing" in o); //False console.log(o.nothing !== undefined); //False
需要注意的是,"!=="可以區(qū)分undefined和null
4 枚舉屬性把p中的可枚舉屬性賦值到o中,并返回o,如果有同名屬性則覆蓋o中的屬性
function extend (o, p) { for (var prop in p) { o[prop] = p[prop]; } return o; }
如:
var p = {name:"Oliver",age:18,nothing:undefined}; var o = {}; function extend (o, p) { for (var prop in p) { o[prop] = p[prop]; } return o; } console.log(extend(o,p));
將p中的可枚舉屬性復(fù)制到o中,并返回o,如果有同名屬性則不覆蓋o中的屬性
function merge (o, p) { for (var prop in p) { if (o.hasOwnProperty(prop)) { continue; o[prop] = p[prop]; } } return o; }
如:
var p = {name:"Oliver",age:18,nothing:undefined}; var o = {name:"Oli"}; function merge (o, p) { for (var prop in p) { if (o.hasOwnProperty(prop)) { continue; o[prop] = p[prop]; } } return o; } console.log(merge(o,p).name); //Oli
如果o中的屬性在p中沒有同名屬性,則從o中刪除這個(gè)屬性
function restrict (o, p) { for (var prop in o) { if (!(prop in p)) { delete o[prop]; } } return o; }
如:
var p = {age:18,nothing:undefined}; var o = {name:"Oli"}; function restrict (o, p) { for (var prop in o) { if (!(prop in p)) { delete o[prop]; } } return o; } console.log(merge(o, p).name); //undefined
如果o中的屬性在p中存在同名屬性,則從o中刪除這個(gè)屬性
function subtract (o, p) { for (var prop in o) { if (prop in p) { delete o[prop]; } } return o; }
如:
var p = {name:"Oliver",age:18,nothing:undefined}; var o = {name:"Oli"}; function subtract (o, p) { for (var prop in o) { if (prop in p) { delete o[prop]; } } return o; } console.log(subtract(o, p).name); //undefined
返回一個(gè)新對(duì)象,這個(gè)對(duì)象同時(shí)擁有o的屬性和p的屬性,如果有重名屬性,使用p中的屬性值
function union (o, p) { for (var prop in o) { if (prop in p) { o[prop] = p[prop] } } return o; }
如:
var p = {name:"Oliver",age:18,nothing:undefined}; var o = {name:"Oli"}; function union (o, p) { for (var prop in o) { if (prop in p) { o[prop] = p[prop] } } return o; } console.log(union(o, p).name); //Oliver
返回一個(gè)新對(duì)象,這個(gè)對(duì)象同時(shí)擁有o的屬性和p的屬性,如果重名,使用o的值
function intersection (o, p) { for (var prop in o) { if (prop in p) { delete p[prop]; } } return o; }
如:
var p = {name:"Oliver",age:18,nothing:undefined}; var o = {name:"Oli"}; function intersection (o, p) { for (var prop in o) { if (prop in p) { delete p[prop]; } } return o; } console.log(intersection(o, p).name); //Oliver
返回一個(gè)數(shù)組,這個(gè)數(shù)組包含的是o中可枚舉的自有屬性的名字
5 屬性getter和setter存取器屬性(accessor property):由getter和setter定義的屬性;它不同于數(shù)據(jù)屬性(data property),數(shù)據(jù)屬性只有一個(gè)簡(jiǎn)單的值;
語(yǔ)法:
var o = { data_prop: value,/*這是普通數(shù)據(jù)屬性*/ get accessor_prop(){/*這里是函數(shù)體*/}, set accessor_prop(value){/*這里是函數(shù)體*/} };
這個(gè)定義沒有使用function關(guān)鍵字,而是使用get和(或)set
存取器屬性是可以繼承的
var o = { n: 0,/*這是普通數(shù)據(jù)屬性*/ get next(){return this.n++}, set next(n){this.n = n} }; o.next = 10; //setter console.log(o.next) //getter6 屬性的特性
存取器屬性的四個(gè)特性:讀取(get)、寫入(set)、可枚舉性(enumerable)和可配置性(configurable)
數(shù)據(jù)屬性的四個(gè)特性:值(value)、可寫性(writable)、可枚舉性(enumerable)和可配置性(configurable)
獲得某個(gè)對(duì)象特定屬性的屬性描述符
Object.getOwnPropertyDescriptor()方法:
//name數(shù)據(jù)屬性 let o = { name: "Oliver", get transferName(){return this.name}, set transferName(value){this.name = name} }; let result = Object.getOwnPropertyDescriptor(o, "name"); console.log(result); //Object for (let name in result) { console.log(name, result[name]); } //value Oliver //writable True //enumerable True //configurable True //transferName存取器屬性 let o = { name: "Oliver", get transferName(){return this.name}, set transferName(value){this.name = name} }; let result = Object.getOwnPropertyDescriptor(o, "transferName"); console.log(result); //Object for (let name in result) { console.log(name, result[name]); } //get function transferName(){return this.name} //set function transferName(value){this.name = name} //enumerable True //configurable True
設(shè)置屬性的特性
Object.defineProperty()方法:
let o = { name: "Oliver", get transferName(){return this.name}, set transferName(value){this.name = name} }; let result = Object.getOwnPropertyDescriptor(o, "name"); console.log(result); //Object for (let name in result) { console.log(name, result[name]); } //value Oliver //writable True //enumerable True //configurable True Object.defineProperty(o, "name", { value: "Oli", writable: false, enumerable: false, configurable: false }); let result1 = Object.getOwnPropertyDescriptor(o, "name"); console.log(result1); //Object for (let name in result1) { console.log(name, result1[name]); } //value Oli //writable False //enumerable False //configurable False
該方法不能修改繼承屬性
設(shè)置多個(gè)屬性特性
Object.defineProperties()方法:
語(yǔ)法:Object.defineProperties(Object, props)
var obj = {}; Object.defineProperties(obj, { x: {value: 1, writable: false, enumerable: true, configurable: false}, y: {get: function(){return this.x}, enumerable: true, configurable: false} }); console.log(obj.y); //1 console.log(obj.x); //1 obj.x = 2; console.log(obj.x); //嚴(yán)格模式下報(bào)錯(cuò)
老式API
在ES5之前,需要用到
__lookupGetter()__
__lookupSetter()__
__defineGetter()__
__defineSetter()__
7 對(duì)象的三個(gè)屬性原型(prototype)
類(class)
可擴(kuò)展性(extensible)
7.1 原型屬性對(duì)象的原型屬性是用來(lái)繼承屬性的
var obj = {}; console.log(obj.constructor); //function Object(){ [native code] } console.log(obj.__proto__); //Object console.log(Object); //function Object(){ [native code] } console.log(Object.prototype); //Object console.log(Object.prototype.isPrototypeOf(obj)); //True
檢測(cè)一個(gè)對(duì)象是否是另一個(gè)對(duì)象的原型
isPrototypeOf()方法
var obj = {}; var anotherObj = Object.create(obj); console.log(Object.prototype.isPrototypeOf(obj)); //True console.log(obj.isPrototypeOf(anotherObj)); //True7.2 類屬性
是一個(gè)字符串,用以表示對(duì)象的類型信息,默認(rèn)的toString()方法很有可能被修改,所以應(yīng)該使用下面的classof函數(shù):
查詢類
使用classof()函數(shù):
function classof (o) { if (o === null) { return "Null"; } if (o === undefined) { return "Undefined"; } return Object.prototype.toString.call(o).slice(8, -1); }
例如:
console.log(classof(obj)); //Object console.log(classof(Number)); //Function console.log(classof(123)); //Number7.3 可擴(kuò)展性
可擴(kuò)展性表示是否可以給對(duì)象添加新屬性
設(shè)置為不可擴(kuò)展,檢測(cè)是否不可擴(kuò)展
Object.preventExtensions()設(shè)置為對(duì)象不可擴(kuò)展
Object.isExtensible()檢測(cè)是否可擴(kuò)展
var obj = { name: "Oliver" }; Object.preventExtensions(obj); obj.name = "Oli"; //可修改屬性的值 delete obj.name; //可配置屬性 obj.age = 18; //不可擴(kuò)展 嚴(yán)格模式下報(bào)錯(cuò)
設(shè)置為不可擴(kuò)展且不可配置,檢測(cè)是否不可擴(kuò)展且不可配置
Object.seal()
Object.isSealed()
var obj = { name: "Oliver" }; Object.seal(obj); obj.name = "Oli"; //可修改屬性的值 delete obj.name; //不可配置屬性 嚴(yán)格模式下報(bào)錯(cuò) obj.age = 18; //不可擴(kuò)展 嚴(yán)格模式下報(bào)錯(cuò)
設(shè)置為不可擴(kuò)展、不可配置且所有數(shù)據(jù)屬性設(shè)置為只讀(setter不受影響),以及檢測(cè)方法
Object.freeze()
Object.isFrozen()
var obj = { name: "Oliver", anotherObj: { name: "Oliver" }, set setName (value) { this.name = value; } }; Object.freeze(obj); obj.anotherObj.name = "Oli"; //可以修改屬性值為對(duì)象的子對(duì)象的屬性 obj.setName = "Oli"; //不可修改setter屬性的值 obj.name = "Oli"; //不可修改屬性的值 delete obj.name; //不可配置屬性 嚴(yán)格模式下報(bào)錯(cuò) obj.age = 18; //不可擴(kuò)展 嚴(yán)格模式下報(bào)錯(cuò)8 序列化對(duì)象
對(duì)象序列化(serialization):將對(duì)象的狀態(tài)轉(zhuǎn)換為字符串,或?qū)⒆址€原成對(duì)象;
JSON.stringify()
JSON.parse()
JSON(JavaScript Object Notation):JavaScript對(duì)象表示法;
var date = new Date(); console.log(date.toString()); //與JSON.stringify()的返回值不同 console.log(date.toJSON()); //與JSON.stringify()的返回值一樣9 對(duì)象方法
toString方法
toLocaleString方法
toJSON方法(嚴(yán)格意義上不算對(duì)象原型的方法)
valueOf方法(用在需要將它轉(zhuǎn)換成某種原始值而非字符串的時(shí)候)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/79051.html
摘要:簡(jiǎn)介原文鏈接簡(jiǎn)稱是一種輕量級(jí),解釋型的編程語(yǔ)言,其函數(shù)是一等公民。標(biāo)準(zhǔn)的目標(biāo)是讓任何一種程序設(shè)計(jì)語(yǔ)言能操控使用任何一種標(biāo)記語(yǔ)言編寫出的任何一份文檔。核心規(guī)定了如何映射基于的文檔結(jié)構(gòu),以便簡(jiǎn)化對(duì)文檔的任意部分的訪問(wèn)和操作。 JavaScript 簡(jiǎn)介 原文鏈接 JavaScript ( 簡(jiǎn)稱:JS ) 是一種 輕量級(jí),解釋型 的編程語(yǔ)言,其函數(shù)是一等公民。眾所周知,它是用于網(wǎng)頁(yè)開發(fā)的腳...
摘要:舉個(gè)例子在上面的例子可以看到,我們聲明是一個(gè)數(shù)字,但是我們?cè)谥髮⒌闹涤指某闪俗址筒紶栔岛竺鏁?huì)講這些類型。基本類型字符串表示一個(gè)字符串,如。因此,我們可以寫一個(gè)函數(shù),用來(lái)精確檢測(cè)類型。 showImg(https://segmentfault.com/img/remote/1460000017309509?w=850&h=572); 定義 1. 什么是數(shù)據(jù)類型? 數(shù)據(jù)類型,就是將...
摘要:不過(guò)讓流行起來(lái)的原因應(yīng)該是是目前所有主流瀏覽器上唯一支持的腳本語(yǔ)言。經(jīng)過(guò)測(cè)試,數(shù)字字符串布爾日期可以直接賦值,修改不會(huì)產(chǎn)生影響。再考慮對(duì)象類型為或者的情況。對(duì)于結(jié)果聲明其類型。判斷對(duì)象的類型是還是,結(jié)果類型更改。 轉(zhuǎn)載自我的個(gè)人博客 歡迎大家批評(píng)指正 1. 第一個(gè)頁(yè)面交互 這里最需要學(xué)習(xí)的老師的代碼中,每一部分功能都由函數(shù)控制,沒有創(chuàng)建一個(gè)全部變量。且最后有一個(gè)函數(shù)來(lái)控制執(zhí)行代碼...
摘要:更形象的我們還可以將面向?qū)ο罄斫鉃橐环N宗教信仰。這就導(dǎo)致面向?qū)ο蠼痰某绦騿T們?cè)趯憰r(shí)就很難受。所以為了滿足信仰面向?qū)ο蠼痰男枨笸ㄟ^(guò)構(gòu)造函數(shù)的形式模擬了偽類。這個(gè)套路的核心就是類那么里沒有類所以其實(shí)是通過(guò)構(gòu)造函數(shù)來(lái)模擬的偽類。 JS面向?qū)ο笾?【概述】 在學(xué)習(xí)JS的面向?qū)ο笾?我們應(yīng)該先自問(wèn)這樣幾個(gè)問(wèn)題: 面向?qū)ο笫鞘裁匆馑? 學(xué)習(xí)面向?qū)ο蟮暮诵氖鞘裁? 為什么要學(xué)習(xí)面向?qū)ο?(它的...
摘要:在同一個(gè)塊內(nèi),不允許用重復(fù)聲明變量。中為新增了塊級(jí)作用域。自帶遍歷器的對(duì)象有數(shù)組字符串類數(shù)組對(duì)象對(duì)象的對(duì)象等和結(jié)構(gòu)對(duì)象。返回一個(gè)遍歷器,使遍歷數(shù)組的鍵值對(duì)鍵名鍵值。 目錄 1.語(yǔ)法 2.類型、值和變量 3.表達(dá)式和運(yùn)算符 4.語(yǔ)句 5.數(shù)組 6.對(duì)象 7.函數(shù) 8.全局屬性和方法 9.詞法作用域、作用域鏈、閉包 10.原型鏈、繼承機(jī)制 11.this的理解 12.ES5新特性 13.E...
摘要:原始表達(dá)式直接量保留字變量原始表達(dá)式表達(dá)式的最小單位表達(dá)式中的短語(yǔ),解釋器會(huì)將其計(jì)算為一個(gè)結(jié)果對(duì)象和數(shù)據(jù)的初始化表達(dá)式對(duì)象直接量和數(shù)組直接量,它們和布爾直接量不同,它們不是原始表達(dá)式函數(shù)定義表達(dá)式函數(shù)直接量也不是原始表達(dá)式屬性訪問(wèn)表達(dá)式語(yǔ)法 1 原始表達(dá)式 直接量、保留字、變量 原始表達(dá)式(primary expression):表達(dá)式的最小單位 表達(dá)式:JavaScript中的短語(yǔ)...
閱讀 711·2021-11-22 13:54
閱讀 3077·2021-09-26 10:16
閱讀 3505·2021-09-08 09:35
閱讀 1585·2019-08-30 15:55
閱讀 3435·2019-08-30 15:54
閱讀 2082·2019-08-30 10:57
閱讀 502·2019-08-29 16:25
閱讀 883·2019-08-29 16:15