国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript對象的原型(prototype)、類(class)和可擴展性(extendibl

lewinlee / 1282人閱讀

摘要:每個對象都有與之相關的原型類和可擴展性。通過創建對象通過關鍵字和構造函數調用創建的對象的原型就是構造函數的屬性的值。所有的內置構造函數以及大部分自定義的構造函數都具有一個繼承自的原型。,檢測對象是否被凍結

每個JavaScript對象都有與之相關的原型(prototype)、類(class)和可擴展性(extendible)。

原型屬性

對象的原型屬性是用來繼承屬性的。我們經常把一個對象的原型屬性稱做“原型”。在JavaScript中有三種方式創建對象。

對象直接量

var o = { x: 1 };

通過對象直接量創建的對象都有同一個原型對象,即Object.prototype。

通過new創建對象

var o1 = new Object();
var a = new Array();

通過new關鍵字和構造函數調用創建的對象的原型就是構造函數的prototype屬性的值。比如上面的通過new Object()創建的對象也繼承自Object.prototype。通過new Array()創建的對象的原型就是Array.prototype。所有的內置構造函數(以及大部分自定義的構造函數)都具有一個繼承自Object.prototype的原型。所以,Array.prototype的屬性繼承自Object.prototype,由new Array()創建的Array對象的屬性同時繼承自Array.prototype和Object.prototype。這一系列鏈接的原型對象就是所謂的“原型鏈”(prototype chain)。

Object.create()

ECMAScript 5 定義了一個名為Object.create()的方法,它創建一個新對象,其中第一個參數是這個對象的原型。第二個參數是可選參數,用以對對象的屬性進行進一步描述。Object.create()是一個靜態函數,而不是提供給某個對象調用的方法。

// 一個參數
var o2 =  Object.create({x:1});
// 兩個參數
var o3 = Object.create({x:1}, {
  // foo會成為所創建對象的數據屬性
  foo: { 
    writable:true,
    configurable:true,
    value: "hello" 
  },
  // bar會成為所創建對象的訪問器屬性
  bar: {
    configurable: false,
    get: function() { return 10 },
    set: function(value) {
      console.log("Setting `o.bar` to", value);
    }
  }
});

o3的原型是對象{x:1},而{x:1}的原型是Object.prototype,所以o3同時繼承自{x:1}和Object.prototype。

縱觀上面三種方法,幾乎所有JavaScript都有原型對象,并且都直接或者間接繼承自Object.prototype。沒有原型的對象并不多,Object.prototype就是其中之一,它不繼承任何屬性。
下面介紹兩個與原型相關的方法:

Object.getPrototypeOf(),在ECMAScript中,將對象作為參數傳入Object.getPrototypeOf()可以查詢它的原型。

isPrototypeOf(),而要檢測一個對象是否是另一個對象的原型,可以使用方法isPrototypeOf()方法。

類屬性

對象的類屬性是一個字符串,用以表示對象的類型信息。ECMAScript 3 和ECMAScript 5 都沒有設置這個屬性的方法,有一種間接的方法可以查詢它——默認的toString方法(基礎自Object.prototype)返回了如下格式的字符串:
[object class]
因此想要獲得對象的類,可以調用對象的toString()方法,然后提取已返回字符串的第8個到倒數第二個位置之間的字符串。需要注意的是,很多對象繼承的toString()方法重寫了,為了能調用正確的toString()版本,必須間接的調用Function.call()方法。下面的classOf()函數可以返回傳遞給它的任意對象的類:

function classOf (o) {
    if (o === null) return "Null";
    if (o === undefined) return "Undefined";
    return Object.prototype.toString.call(o).slice(8, -1);
}
可擴展性

對象的擴展性用以表示是否可以給對象添加新屬性。所有內置對象和自定義對象都是顯式可擴展的,宿主對象的可擴展性是由JavaScript引擎決定的。

Object.esExtensible(),判斷對象是否是可擴展的

Object.preventExtendsions(),將對象轉換為不可擴展的,一旦將對象轉換成不可擴展的,就無法再將其轉換為可擴展的了

Object.seal(),將對象轉換成不可擴展的和不可配置的

Object.freeze(),鎖定對象——“凍結”,將對象轉換成不可擴展的和不可配置的,所有的數據屬性都設置為只讀的。

Object.isFrozen(),檢測對象是否被“凍結”

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/89261.html

相關文章

  • JavaScript戀愛之對象三個屬性

    摘要:為要檢測的對象構造函數創建的對象繼承了一個叫的屬性,該屬性指代該構造函數,即的原型。使用直接量創建的對象,也有一個叫的屬性,該屬性指代構造函數,所以直接量創建的對象的真正原型是,使用方法來檢測對象的原型并不可靠,在以后的文章中會提到。 一、原型屬性 1、對象的原型屬性是用來繼承屬性的,這個屬性如此重要,我們通常稱為:對象的原型屬性或對象的原型。對象的原型是在對象實例化的時候就設置好的...

    wanglu1209 評論0 收藏0
  • 理解js原型與繼承

    摘要:相當于在用原型繼承編寫復雜代碼前理解原型繼承模型十分重要。同時,還要清楚代碼中原型鏈的長度,并在必要時結束原型鏈,以避免可能存在的性能問題。 js是一門動態語言,js沒有類的概念,ES6 新增了class 關鍵字,但只是語法糖,JavaScript 仍舊是基于原型。 至于繼承,js的繼承與java這種傳統的繼承不一樣.js是基于原型鏈的繼承. 在javascript里面,每個對象都有一...

    wthee 評論0 收藏0
  • 淺談JavaScript面向對象封裝、繼承、多態

    摘要:會造成內存浪費的問題構造函數繼承聲明父類聲明子類生成實例組合式繼承組合式繼承是汲取了兩者的優點,既避免了內存浪費,又使得每個實例化的子類互不影響。 寫在前面 既然是淺談,就不會從原理上深度分析,只是幫助我們更好地理解... 面向對象與面向過程 面向對象和面向過程是兩種不同的編程思想,剛開始接觸編程的時候,我們大都是從面向過程起步的,畢竟像我一樣,大家接觸的第一門計算機語言大概率都是C語...

    MAX_zuo 評論0 收藏0
  • 條理清晰JavaScript面向對象

    摘要:當去調用一個函數這個時候函數中的就指向創建出來的對象而且函數的的返回值直接就是隱式返回有一個默認慣例就是構造函數的名字首字母大寫。面向對象關注特征和功能。 最近一直在搞基礎的東西,弄了一個持續更新的github筆記,可以去看看,誠意之作(本來就是寫給自己看的……)鏈接地址:Front-End-Basics 此篇文章的地址:面向對象 基礎筆記的github地址:https://g...

    elliott_hu 評論0 收藏0
  • 面向對象 JavaScript

    摘要:是完全的面向對象語言,它們通過類的形式組織函數和變量,使之不能脫離對象存在。而在基于原型的面向對象方式中,對象則是依靠構造器利用原型構造出來的。 JavaScript 函數式腳本語言特性以及其看似隨意的編寫風格,導致長期以來人們對這一門語言的誤解,即認為 JavaScript 不是一門面向對象的語言,或者只是部分具備一些面向對象的特征。本文將回歸面向對象本意,從對語言感悟的角度闡述為什...

    novo 評論0 收藏0

發表評論

0條評論

lewinlee

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<