javascript -- 面向對象(一)

1、理解對象html

  「萬物皆對象」,所謂對象,就是擁有本身的屬性和方法的數據。最簡單的是經過如下兩種方式來定義對象json

<script>
		//1、開始的模式,經過初實例化一個Object對象,賦給變量person,並在person上添加屬性和方法
		// var person = new Object();
		// person.name = "jiang";
		// person.age = 29;
		// person.job = "software engineer";

		// person.sayName = function(){
		// 	console.log(this.name);
		// }
		// person.sayName();
		//2、 字面量形式建立對象,說明白點就是json形式的數據
		var person={
			name: 'jiang2',
			age: 29,
			job: 'software engineer',
			sayName: function(){
				console.log(this.name);
			}
		}
		person.sayName();
<script>

2、屬性類型函數

1. 數據屬性含義:包含一個數據值的位置,在這個位置上能夠讀取和寫入值,數據屬性有4個描述行爲的特徵,分別是configurable、enumerable、writable、value。this

  configurable:可否經過delete刪除屬性從而從新定義屬性,可否修改屬性的特徵或者修改成訪問其屬性,其默認值爲truespa

  enumerable:表示可否經過for-in循環番薯屬性,默認爲truecode

  writable: 可否修改屬性的值。默認爲truehtm

  value:包含這個屬性的數據值,其餘屬性特性都被設置爲true,而value特性被設置爲指定的值對象

經過代碼來分析屬性:blog

//eg,如下例子的name屬性的value值就是jiang
        // var person ={
        //     name : 'jiang'
        // };

        var person = {};
        Object.defineProperty(person, 'name', {
            writable: false,
            value: 'jaing'
        });//這說明,當name的writable屬性設置爲FALSE,該屬性沒法修改value的值
        console.log(person.name);
        person.name = 'zhen';
        console.log(person.name);


        var person2 = {};
        Object.defineProperty(person2, 'name', {
            configurable: false,
            value: 'jiang2'
        });
        console.log(person2.name);
        delete person2.name;
        //當configurable爲FALSE。delete沒法刪除name屬性
        //對name屬性調用delete在非嚴格模式下不會發生問題,可是在嚴格模式下就會出錯,而且一旦設置了FALSE,
     //就不能夠再變回true,此時在調用Object.defineProperty方法修改writable以外的特徵,都會報錯 console.log(person2.name); //調用Object.defineProperty方法時,前三個特徵的默認值都是FALSE

2. 訪問器屬性:ip

configurable:他們包括getter和setter方法,讀取訪問器屬性時,會調用getter方法,負責返回有效值,寫入時調用setter方法傳入新值,默認值爲true

enumerable:表示可否經過for-in循環返回屬性,默認爲true

get: 讀取屬性時調用,默認值爲undefined

set:寫入屬性時調用,默認值爲undefined

要注意的是:訪問器屬性不能直接定義,必需要經過Object.defineProperty()來定義

var book = {
            _year: 2014,
            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;
        console.log(book.edition);

不必定要同時指定getter和setter,只指定getter意味着屬性是不能寫,嘗試寫入屬性會被忽略掉,在嚴格模式下,嘗試寫入只指定getter函數的屬性會拋出錯誤,相似的,只指定setter函數的屬性也不能讀,不然在非嚴格模式下會返回undefined,嚴格模式下就會跑出錯誤

 

建立訪問器屬性,通常都使用兩個非標準的方法,__defineGetter__ 和 __defineSetter__

var book2 = {
            _year : 2014,
            edition : 1
        };
        book2.__defineGetter__('year', function(){
            return this._year;
        });
        book2.__defineSetter__('year', function(newValue){
            if(newValue > 2014){
                    this._year = newValue;
                    this.edition += newValue - 2014;
                }
        });
        book2.year = 2016;
        console.log(book2.edition);
相關文章
相關標籤/搜索