摘要:每個(gè)對(duì)象都有與之相關(guān)的原型類和可擴(kuò)展性。通過(guò)創(chuàng)建對(duì)象通過(guò)關(guān)鍵字和構(gòu)造函數(shù)調(diào)用創(chuàng)建的對(duì)象的原型就是構(gòu)造函數(shù)的屬性的值。所有的內(nèi)置構(gòu)造函數(shù)以及大部分自定義的構(gòu)造函數(shù)都具有一個(gè)繼承自的原型。,檢測(cè)對(duì)象是否被凍結(jié)
每個(gè)JavaScript對(duì)象都有與之相關(guān)的原型(prototype)、類(class)和可擴(kuò)展性(extendible)。
原型屬性對(duì)象的原型屬性是用來(lái)繼承屬性的。我們經(jīng)常把一個(gè)對(duì)象的原型屬性稱做“原型”。在JavaScript中有三種方式創(chuàng)建對(duì)象。
對(duì)象直接量
var o = { x: 1 };
通過(guò)對(duì)象直接量創(chuàng)建的對(duì)象都有同一個(gè)原型對(duì)象,即Object.prototype。
通過(guò)new創(chuàng)建對(duì)象
var o1 = new Object(); var a = new Array();
通過(guò)new關(guān)鍵字和構(gòu)造函數(shù)調(diào)用創(chuàng)建的對(duì)象的原型就是構(gòu)造函數(shù)的prototype屬性的值。比如上面的通過(guò)new Object()創(chuàng)建的對(duì)象也繼承自O(shè)bject.prototype。通過(guò)new Array()創(chuàng)建的對(duì)象的原型就是Array.prototype。所有的內(nèi)置構(gòu)造函數(shù)(以及大部分自定義的構(gòu)造函數(shù))都具有一個(gè)繼承自O(shè)bject.prototype的原型。所以,Array.prototype的屬性繼承自O(shè)bject.prototype,由new Array()創(chuàng)建的Array對(duì)象的屬性同時(shí)繼承自Array.prototype和Object.prototype。這一系列鏈接的原型對(duì)象就是所謂的“原型鏈”(prototype chain)。
Object.create()
ECMAScript 5 定義了一個(gè)名為Object.create()的方法,它創(chuàng)建一個(gè)新對(duì)象,其中第一個(gè)參數(shù)是這個(gè)對(duì)象的原型。第二個(gè)參數(shù)是可選參數(shù),用以對(duì)對(duì)象的屬性進(jìn)行進(jìn)一步描述。Object.create()是一個(gè)靜態(tài)函數(shù),而不是提供給某個(gè)對(duì)象調(diào)用的方法。
// 一個(gè)參數(shù) var o2 = Object.create({x:1}); // 兩個(gè)參數(shù) var o3 = Object.create({x:1}, { // foo會(huì)成為所創(chuàng)建對(duì)象的數(shù)據(jù)屬性 foo: { writable:true, configurable:true, value: "hello" }, // bar會(huì)成為所創(chuàng)建對(duì)象的訪問(wèn)器屬性 bar: { configurable: false, get: function() { return 10 }, set: function(value) { console.log("Setting `o.bar` to", value); } } });
o3的原型是對(duì)象{x:1},而{x:1}的原型是Object.prototype,所以o3同時(shí)繼承自{x:1}和Object.prototype。
縱觀上面三種方法,幾乎所有JavaScript都有原型對(duì)象,并且都直接或者間接繼承自O(shè)bject.prototype。沒(méi)有原型的對(duì)象并不多,Object.prototype就是其中之一,它不繼承任何屬性。
下面介紹兩個(gè)與原型相關(guān)的方法:
Object.getPrototypeOf(),在ECMAScript中,將對(duì)象作為參數(shù)傳入Object.getPrototypeOf()可以查詢它的原型。
isPrototypeOf(),而要檢測(cè)一個(gè)對(duì)象是否是另一個(gè)對(duì)象的原型,可以使用方法isPrototypeOf()方法。
類屬性對(duì)象的類屬性是一個(gè)字符串,用以表示對(duì)象的類型信息。ECMAScript 3 和ECMAScript 5 都沒(méi)有設(shè)置這個(gè)屬性的方法,有一種間接的方法可以查詢它——默認(rèn)的toString方法(基礎(chǔ)自O(shè)bject.prototype)返回了如下格式的字符串:
[object class]
因此想要獲得對(duì)象的類,可以調(diào)用對(duì)象的toString()方法,然后提取已返回字符串的第8個(gè)到倒數(shù)第二個(gè)位置之間的字符串。需要注意的是,很多對(duì)象繼承的toString()方法重寫(xiě)了,為了能調(diào)用正確的toString()版本,必須間接的調(diào)用Function.call()方法。下面的classOf()函數(shù)可以返回傳遞給它的任意對(duì)象的類:
function classOf (o) { if (o === null) return "Null"; if (o === undefined) return "Undefined"; return Object.prototype.toString.call(o).slice(8, -1); }可擴(kuò)展性
對(duì)象的擴(kuò)展性用以表示是否可以給對(duì)象添加新屬性。所有內(nèi)置對(duì)象和自定義對(duì)象都是顯式可擴(kuò)展的,宿主對(duì)象的可擴(kuò)展性是由JavaScript引擎決定的。
Object.esExtensible(),判斷對(duì)象是否是可擴(kuò)展的
Object.preventExtendsions(),將對(duì)象轉(zhuǎn)換為不可擴(kuò)展的,一旦將對(duì)象轉(zhuǎn)換成不可擴(kuò)展的,就無(wú)法再將其轉(zhuǎn)換為可擴(kuò)展的了
Object.seal(),將對(duì)象轉(zhuǎn)換成不可擴(kuò)展的和不可配置的
Object.freeze(),鎖定對(duì)象——“凍結(jié)”,將對(duì)象轉(zhuǎn)換成不可擴(kuò)展的和不可配置的,所有的數(shù)據(jù)屬性都設(shè)置為只讀的。
Object.isFrozen(),檢測(cè)對(duì)象是否被“凍結(jié)”
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/89261.html
摘要:為要檢測(cè)的對(duì)象構(gòu)造函數(shù)創(chuàng)建的對(duì)象繼承了一個(gè)叫的屬性,該屬性指代該構(gòu)造函數(shù),即的原型。使用直接量創(chuàng)建的對(duì)象,也有一個(gè)叫的屬性,該屬性指代構(gòu)造函數(shù),所以直接量創(chuàng)建的對(duì)象的真正原型是,使用方法來(lái)檢測(cè)對(duì)象的原型并不可靠,在以后的文章中會(huì)提到。 一、原型屬性 1、對(duì)象的原型屬性是用來(lái)繼承屬性的,這個(gè)屬性如此重要,我們通常稱為:對(duì)象的原型屬性或?qū)ο蟮脑汀?duì)象的原型是在對(duì)象實(shí)例化的時(shí)候就設(shè)置好的...
摘要:相當(dāng)于在用原型繼承編寫(xiě)復(fù)雜代碼前理解原型繼承模型十分重要。同時(shí),還要清楚代碼中原型鏈的長(zhǎng)度,并在必要時(shí)結(jié)束原型鏈,以避免可能存在的性能問(wèn)題。 js是一門動(dòng)態(tài)語(yǔ)言,js沒(méi)有類的概念,ES6 新增了class 關(guān)鍵字,但只是語(yǔ)法糖,JavaScript 仍舊是基于原型。 至于繼承,js的繼承與java這種傳統(tǒng)的繼承不一樣.js是基于原型鏈的繼承. 在javascript里面,每個(gè)對(duì)象都有一...
摘要:會(huì)造成內(nèi)存浪費(fèi)的問(wèn)題構(gòu)造函數(shù)繼承聲明父類聲明子類生成實(shí)例組合式繼承組合式繼承是汲取了兩者的優(yōu)點(diǎn),既避免了內(nèi)存浪費(fèi),又使得每個(gè)實(shí)例化的子類互不影響。 寫(xiě)在前面 既然是淺談,就不會(huì)從原理上深度分析,只是幫助我們更好地理解... 面向?qū)ο笈c面向過(guò)程 面向?qū)ο蠛兔嫦蜻^(guò)程是兩種不同的編程思想,剛開(kāi)始接觸編程的時(shí)候,我們大都是從面向過(guò)程起步的,畢竟像我一樣,大家接觸的第一門計(jì)算機(jī)語(yǔ)言大概率都是C語(yǔ)...
摘要:當(dāng)去調(diào)用一個(gè)函數(shù)這個(gè)時(shí)候函數(shù)中的就指向創(chuàng)建出來(lái)的對(duì)象而且函數(shù)的的返回值直接就是隱式返回有一個(gè)默認(rèn)慣例就是構(gòu)造函數(shù)的名字首字母大寫(xiě)。面向?qū)ο箨P(guān)注特征和功能。 最近一直在搞基礎(chǔ)的東西,弄了一個(gè)持續(xù)更新的github筆記,可以去看看,誠(chéng)意之作(本來(lái)就是寫(xiě)給自己看的……)鏈接地址:Front-End-Basics 此篇文章的地址:面向?qū)ο? 基礎(chǔ)筆記的github地址:https://g...
摘要:是完全的面向?qū)ο笳Z(yǔ)言,它們通過(guò)類的形式組織函數(shù)和變量,使之不能脫離對(duì)象存在。而在基于原型的面向?qū)ο蠓绞街校瑢?duì)象則是依靠構(gòu)造器利用原型構(gòu)造出來(lái)的。 JavaScript 函數(shù)式腳本語(yǔ)言特性以及其看似隨意的編寫(xiě)風(fēng)格,導(dǎo)致長(zhǎng)期以來(lái)人們對(duì)這一門語(yǔ)言的誤解,即認(rèn)為 JavaScript 不是一門面向?qū)ο蟮恼Z(yǔ)言,或者只是部分具備一些面向?qū)ο蟮奶卣鳌1疚膶⒒貧w面向?qū)ο蟊疽猓瑥膶?duì)語(yǔ)言感悟的角度闡述為什...
閱讀 2083·2023-04-26 02:41
閱讀 2146·2021-09-24 09:47
閱讀 1546·2019-08-30 15:53
閱讀 1205·2019-08-30 13:01
閱讀 1885·2019-08-29 11:27
閱讀 2857·2019-08-28 17:55
閱讀 1740·2019-08-26 14:00
閱讀 3377·2019-08-26 10:18