摘要:構(gòu)造函數(shù)原型對(duì)象實(shí)例對(duì)象之間的關(guān)系錯(cuò)綜復(fù)雜,關(guān)于它們的屬性和方法很多,長(zhǎng)得也很像。表示能否修改屬性的值。屬性和方法以下的屬性和方法均以下面的代碼為例構(gòu)造函數(shù)指向原型對(duì)象,包含所有被實(shí)例共享的屬性和方法。
構(gòu)造函數(shù)、原型對(duì)象、實(shí)例對(duì)象之間的關(guān)系錯(cuò)綜復(fù)雜,關(guān)于它們的屬性和方法很多,長(zhǎng)得也很像。這里歸納出來(lái),方便記憶和查閱。
對(duì)象屬性類型 數(shù)據(jù)屬性[[Configurable]]:表示能否通過(guò)delete刪除屬性從而重新定義屬性、能否修改屬性的特性、能否把屬性修改為訪問(wèn)器屬性。默認(rèn)值為true。
[[Enumerable]]:表示是否可枚舉。默認(rèn)值為true。
[[Writable]]:表示能否修改屬性的值。默認(rèn)值為true。
[[Value]]:包含屬性的數(shù)據(jù)值,在這里讀寫屬性。默認(rèn)值為undefined。
修改屬性的特性:Object.defineProperty()、Object.defineProperties()。調(diào)用這兩個(gè)方法時(shí),如果不指定,configurable、enumerable、writable特性的默認(rèn)值都是false。
//定義一個(gè)屬性 var person = {}; Object.defineProperty(person, "name", { value: "hiyohoo", configurable: true, enumerable: true, writable: true }); //定義多個(gè)屬性 var person = {}; Object.defineProperties(person, { name: { value: "hiyohoo" }, age: { value: 24, configurable: true, writable: true } });
獲取屬性的特性:Object.getOwnPropertyDescriptor()只能用于實(shí)例屬性,要取得原型屬性的描述符,需要在原型上使用該方法。
var descriptor = Object.getOwnPropertyDescriptor(person, "age"); alert(descriptor.writable); //true訪問(wèn)器屬性
[[Configurable]]
[[Enumerable]]
[[Get]]:讀取屬性時(shí)調(diào)用該函數(shù)。默認(rèn)值為undefined。
[[Set]]:寫入屬性時(shí)調(diào)用該函數(shù)。默認(rèn)值為undefined。
訪問(wèn)器屬性不能直接定義,必須使用Object.defineProperty()來(lái)定義。訪問(wèn)器屬性常用于改變?cè)搶傩裕渌麑傩砸矔?huì)變化的情況。
var book = { _year: 2004, //屬性前面的下劃線記號(hào)常用于表示只能通過(guò)對(duì)象方法訪問(wèn)的屬性。 edition: 1 }; Object.defineProperty(book, "year", { get: function() { return this._year; }, set: function(newValue) { if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } }); book.year = 2016; console.log(book.edition); //13屬性和方法
以下的屬性和方法均以下面的代碼為例:
var Person = function(name) { this.name = name; }; Person.prototype.school = "HNU"; Person.prototype.sayName = function() { return this.name; }; var person = new Person("hiyohoo");構(gòu)造函數(shù)
prototype指向原型對(duì)象,包含所有被實(shí)例共享的屬性和方法。
console.log(Person.prototype); //Person{}原型對(duì)象
constructor指向構(gòu)造函數(shù)。
console.log(Person.prototype.constructor === Person); //true
isPrototypeOf()判斷實(shí)例與原型之間的關(guān)系。
console.log(Person.prototype.isPrototypeOf(person)); //true實(shí)例對(duì)象
constructor沿著原型鏈找到原型中的constructor屬性,最終指向構(gòu)造函數(shù)。
console.log(person.constructor === Person); //true
__proto__Firefox、Safari、Chrome支持這個(gè)屬性,指向原型對(duì)象。
console.log(person.__proto__ === Person.prototype); //true
hasOwnProperty()從Object中繼承而來(lái),判斷屬性是否是實(shí)例的私有屬性,而不是繼承而來(lái)的共享屬性。
console.log(person.hasOwnProperty("name")); //true console.log(person.hasOwnProperty("school")); //falseObject
Object.getPrototypeOf() ECMAScript 5中新增的方法,返回實(shí)例的原型。
console.log(Object.getPrototypeOf(person)); //Person{}
Object.keys() ECMAScript 5中新增的方法,返回一個(gè)包含所有可枚舉實(shí)例屬性的字符串?dāng)?shù)組。
console.log(Object.keys(person)); //["name"] console.log(Object.keys(Person.prototype)); //["school", "sayName"]
Object.getOwnPropertyNames()返回所有實(shí)例屬性,無(wú)論是否可枚舉。
console.log(Object.getOwnPropertyNames(person)); //["name"] console.log(Object.getOwnPropertyNames(Person.prototype)); //["constructor", "school", "sayName"]操作符
delete刪除一個(gè)configurable為true的私有屬性。
delete person.name; delete person.school; console.log(person.name); //undefined console.log(person.school); //HNU
for-in返回所有能夠訪問(wèn)到的屬性。
for (p in person) { console.log(p); //name school sayName }
in對(duì)象能夠訪問(wèn)到屬性時(shí)返回true
console.log("name" in person); //true console.log("sayName" in person); //true console.log("age" in person); //false
同時(shí)使用hasOwnProperty()方法和in操作符,可以確定一個(gè)屬性是存在于對(duì)象中還是存在于原型中。
function isPrototypeProperty(object, name) { if (!(name in object)) { return ("Can"t find " + """ + name + """); } else if (object.hasOwnProperty(name)) { return false; } else { return true; } } console.log(isPrototypeProperty(person, "name")); //false console.log(isPrototypeProperty(person, "school")); //true console.log(isPrototypeProperty(person, "age")); //Can"t find "age"
instanceof用于判斷一個(gè)對(duì)象是否是某個(gè)對(duì)象的實(shí)例。
console.log(person instanceof Person); //true console.log(person instanceof Object); //true
轉(zhuǎn)載請(qǐng)注明出處:https://segmentfault.com/a/1190000004561741
文章不定期更新完善,如果能對(duì)你有一點(diǎn)點(diǎn)啟發(fā),我將不勝榮幸。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/78825.html
摘要:主要用于枚舉對(duì)象數(shù)組遍歷效率最低的方法。當(dāng)前數(shù)組元素的值。傳遞給函數(shù)的初始值注意對(duì)于空數(shù)組是不會(huì)執(zhí)行回調(diào)函數(shù)的。 前言 PS: 2018/04/26 優(yōu)化一下排版,重新梳理一下方法,補(bǔ)充一些信息,刪除JQuery庫(kù)用法,只講解Javascript自帶的, for in 語(yǔ)句用于遍歷數(shù)組或者對(duì)象的屬性(對(duì)數(shù)組或者對(duì)象的屬性進(jìn)行循環(huán)操作)。主要用于枚舉對(duì)象, 數(shù)組遍歷效率最低的方法。 va...
摘要:局部變量在函數(shù)中聲明的變量,會(huì)成為函數(shù)的局部變量。局部變量的作用域是局部的只能在函數(shù)內(nèi)部訪問(wèn)它們。單獨(dú)的情況下,指的是全局對(duì)象。在事件中,指的是接收事件的元素。布爾值提供一種布爾數(shù)據(jù)類型。所有不具有真實(shí)值的即為布爾值為零負(fù)零空值。 閉包 閉包的優(yōu)點(diǎn):1.可以讀取函數(shù)內(nèi)部的變量2.這些變量的值始終保持在內(nèi)存中適用場(chǎng)景 作用域 作用域指的是有權(quán)訪問(wèn)的變量集合。在 JavaScript 中有...
摘要:在此,我們首先根據(jù)變量的作用域,將變量劃分為三級(jí),具體是全局變量局部變量和參數(shù)變量。 【摘要】本文是專為JavaScript入門者而總結(jié)的,總體上將JavaScript的基礎(chǔ)部分分成了九大塊,分別是變量、運(yùn)算符、數(shù)組、流程控制結(jié)構(gòu)、字符串函數(shù)、函數(shù)基礎(chǔ)、DOM操作基礎(chǔ)、文檔對(duì)象模型DOM和正則表達(dá)式。 【關(guān)鍵字】變量、運(yùn)算符、數(shù)組、流程控制結(jié)構(gòu)、函數(shù)、DOM、正則表達(dá)式。 本篇文章的主...
摘要:目前在前端開發(fā)所占的比重越來(lái)越高,在我們學(xué)習(xí)和開發(fā)的過(guò)程中都會(huì)去使用。下面把程序員雷雪松對(duì)的知識(shí)點(diǎn)總結(jié)和歸納分享給大家。過(guò)濾對(duì)同胞元素的搜索。將匹配元素集合縮減為集合中的最后一個(gè)元素。返回指定元素相對(duì)于其他指定元素的位置。 jQuery目前在Web前端開發(fā)所占的比重越來(lái)越高,在我們jQuery學(xué)習(xí)和開發(fā)的過(guò)程中都會(huì)去使用。jQuery幫我們解決了瀏覽器之間JS一些不兼容的地方和簡(jiǎn)化了原...
摘要:圖示如下而對(duì)于引用類型的復(fù)制可不是這樣這個(gè)復(fù)制只是將的引用賦值給,二者是屬于同一個(gè)引用,訪問(wèn)的都是堆內(nèi)存中的同一個(gè)對(duì)象,任何一個(gè)該引用的變量發(fā)生變化,會(huì)對(duì)其余使用該引用的變量也發(fā)生變化。 這兩天自己在寫代碼的時(shí)候,出現(xiàn)一個(gè)BUG,代碼如下: class Car { constructor(carId) { this.position =...
閱讀 578·2023-04-25 21:29
閱讀 1104·2023-04-25 21:27
閱讀 1044·2021-11-25 09:43
閱讀 1077·2021-09-29 09:43
閱讀 3614·2021-09-03 10:30
閱讀 2854·2019-08-29 15:26
閱讀 2803·2019-08-29 12:52
閱讀 1741·2019-08-29 11:10