JavaScript:面向對象

来源:http://www.cnblogs.com/xiaoxiaoyihan/archive/2016/06/08/5569090.html
-Advertisement-
Play Games

面向對象的一個標誌是它們都有類的概念,而JavaScript中沒有類的概念,因此它的對象與其他語言基於類的對象定義不同。 理解對象 前面介紹過對象的兩種創建方式:構造函數和對象字面量: var p = new Object(); p.name = "蕭蕭弈寒"; p.blog = "cnblogs. ...


面向對象的一個標誌是它們都有類的概念,而JavaScript中沒有類的概念,因此它的對象與其他語言基於類的對象定義不同。

理解對象

前面介紹過對象的兩種創建方式:構造函數和對象字面量:

var p = new Object();
p.name = "蕭蕭弈寒";
p.blog = "cnblogs.com";
p.sayName = function() {
    alert(this.name);
}

var person = {
    name : "蕭蕭弈寒",
    blog : "cnblogs.com",
    
    sayName : function() {
        alert(this.name);
    }
}

1.屬性類型

JavaScript中有兩種屬性:數據屬性和訪問器屬性。

1.1數據屬性

數據屬性包括一個數據值的位置。在這個位置可以讀取和寫入值。數據屬性有4個特性:

  • [[Configurable]]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性特性,或者能否把屬性修改為訪問器屬性。
  • [[Enumerable]]:表示能否通過for-in迴圈返回屬性。
  • [[Writable]]:表示能否修改屬性的值。
  • [[Value]]:包含屬性的值。讀取屬性值的時候,從這個位置讀,寫入屬性值的時在這個位置寫入新值。預設值為undefined。

JavaScript的Object.defineProperty()方法要修改預設屬性的特性。這個方法接收三個參數:屬性所在的對象屬性名和一個描述符對象。其中描述符對象必須是:configurable、enumerable、writable和value。設置其中的一或多個值,可以修改對應的特性值。

var person = {};
Object.defineProperty(person, "name", {
    writable : false,
    value : "cnblogs"
});

alert(person.name);    // "cnblogs"
person.name = "xxyh";
alert(person.name);    // "cnblogs"

類似的規則也適用於不可配置的屬性。例如:

var person = {};
Object.defineProperty(person, "name", {
    congigurable : false,
    value : "cnblogs"
});

alert(person.name);    // "cnblogs"
delete person.name;
alert(person.name);    // "cnblogs"

把configurable設置為false,表示不能從對象中刪除屬性。一旦把屬性定義為不可配置的,則不能再將其設置為可配置的。如果在調用Object.defineProperty()方法修改除了writable之外的特性都會出錯。

var person = {};
Object.defineProperty(person, "name", {
    configurable : false,
    value : "xxyh"
});

Object.defineProperty(person, "name", {
    configurable : true,    // 出錯
    value : "xxyh"
});

1.2訪問器屬性

訪問器屬性不包含數據值;它們包含一對getter和setter函數(不是必需的),用於訪問器屬性的讀寫。訪問器屬性有四個特性:

  • [[Configurable]]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為數據屬性。預設值為true。
  • [[Enumerable]]:表示能否通過for-in迴圈返回屬性。
  • [[Get]]:在讀取屬性時調用函數。預設值為undefined
  • [[Set]]:在寫入屬性時調用函數。預設值為undefined

訪問器屬性不能直接定義,必須使用Object.defineProperty()定義。

var book = {
    _year : 2015,
    edition : 1
};

Object.defineProperty(book, "year", {
    get : function() {
        return this._year;
    },
    set : function(newValue) {
        if (newValue > 2014) {
            this._year = newValue;
            this.edition += newValue - 2014;
          }
    }
});

book.year = 2015;
alert(book.edition);    // 2

_year中的下劃線是一種常用標記,表示只能通過對象方法訪問的屬性。

2.定義多個屬性

JavaScript定義了Object.definePerperties(),用於定義多個對象參數。

var book = {};
    
Object.defineProperties(book, {
    _year:{
        value : 2016
    },
    edition:{
        value : 1
    },
    year : {
        get: function () {
            return this._year;
        },
        set: function (newValue) {
            if (newValue > 2015) {
                this._year = newValue;
                this.edition += newValue - 2015;
            }
        }
    }
});

上面在book對象上定義了兩個數據屬性(_year和edition)和一個訪問器屬性(year)。

3.讀取屬性的特性

JavaScript提供了Object.getOwnPropertyDescriptor()方法,用於取得給定屬性的描述符。接收兩個參數:屬性所在的對象要讀取其描述符的屬性名稱。結果返回一個對象。

var book = {};
Object.defineProperties(book, {
    _year: {
        value: 2016
    },
    edition: {
        value: 1
    },
    year:{
        get: function () {
            return this._year;
        },
        set: function (newValue) {
            if (newValue > 2016) {
                this._year = newValue;
                this.edition += newValue - 2015;
            }
        }
    }
});
var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
alert(descriptor.value);        // 2016
alert(descriptor.configurable); // false
alert(typeof descriptor.get);   // "undefined"

var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value);        // undefined
alert(descriptor.enumerable);   // false
alert(typeof descriptor.get);   // "function"

對於數據屬性_year,value等於最初的值,configurable是false,而get等於undefined。對於訪問器屬性year,value等於undefined,enumerable是false,而get是一個執行getter函數的指針。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本來沒想寫這篇文章,但是網上誤導大眾的文章太多了,所以今天就抽出半小時時間談一下我對前端模板引擎的感受吧。 前端模板引擎相信大家都再熟悉不過了,市面上非常多的號稱最好、最快、最牛逼的,隨便就能找到一大把,但是真的深層次的對比才能發現其中的優劣,經過這段時間對各個模板引擎的使用分析,最終選定一款,也是 ...
  • 跨域問題一直是前端中常見的問題,每當說到跨域,第一浮現的技術必然就是JSONP JSONP在我的理解,它並不是ajax,它是在文檔中插入一個script標簽,創建_callback方法,通過伺服器配合執行_callback方法,並傳入一些參數 JSONP的局限就在於,因為是通過插入script標簽, ...
  • 人生的第一份前端工作找到了,感謝大神主子們給半路出家自學的我這麼多的機會,很高興正式踏上客觀又樂趣滿滿的程式員之路,哇咔咔咔。 ​ 分享一個準備面試時遇到的一個有趣的問題: 要求實現類似 調用方式的方法,例如add為加法函數,則調用 輸出3,調用 輸出9。 ​ 函數的調用方式是多次調用同一個函數,將 ...
  • 1、sublime_text下載 https://www.sublimetext.com/3 (選擇相對應的版本) 2、通過package control安裝插件 https://packagecontrol.io/ (package control網站) 在sublime編輯器通過Ctrl+`打開 ...
  • 儘管 HTML5 的完全實現還有很長的路要走,但 HTML5 正在改變 Web,未來 HTML5 將把 Web 帶入一個更加成熟和開放的應用平臺。現在,越來越多的人嘗試用 HTML5 來製作網頁游戲等豐富的 Web 應用。今天要與大家分享的是 21 款基於 HTML5 的游戲,讓大家體驗一下 HTM ...
  • 今天又次體會到jquery的強大了,做了個多級覆選框的效果,代碼總共就20+行就over了。 我又想用js來做一個看看,才寫了幾個方法就寫不動了,相容性要考慮很多,而且代碼量直線上升。 主要分享下jquery的這個效果的實現。代碼塊分兩塊: 一是全選的效果,就是點擊全選的覆選框時它的子孫都相應被選中 ...
  • javascript/js的ajax的GET請求: <script type="text/javascript"> /* 創建 XMLHttpRequest 對象 */ var xmlHttp; function GetXmlHttpObject(){ if (window.XMLHttpReque ...
  • checkbox和radio的美化 checkbox: <style type="text/css"> input[type="checkbox"] { display: none; } input[type="checkbox"] + label { display: inline-block; ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...