JS_オブジェクトを理解する

1970 ワード

1、データの属性
  • [[Configrable]:プロパティをdeleteで削除し、属性を再定義することができますか?デフォルトはtrueです.
  • [[Enumerable]]は、for-i nループで属性を削除することができますか?デフォルトはtrueです.
  • [[Writable]]]属性を変更することができますか?デフォルトはtrueです.
  • [[Value]]:属性を含むデータ値.デフォルトはundefinedです.
  • 属性のデフォルト特性を変更するには、ECMASrpitのObject.defineProperty()メソッドを使用しなければなりません.この方法は3つのパラメータ、属性のあるオブジェクト、属性名、ディスクリプタオブジェクトを受け入れます.
    Object.definePropertyは一つのオブジェクトに対して一つの方法で一回しか呼び出しられません.さもなければ、cannot redfine property:xxx;
    var person = {}
    Object.defineProperty(person, "name", {
    	writable : false,
    	configurable : false,
    	value:"zhangsan"
    });
    person.name = "lisi";
    Object.defineProperty(person, "name", {
    	writable : true
    });
    document.write("pserson.name: " + person.name);
     2、アクセス属性
  • [[Configrable]:プロパティをdeleteで削除し、属性を再定義することができますか?デフォルトはtrueです.
  • [[Enumerable]]は、for-i nループで属性を削除することができますか?デフォルトはtrueです.
  • [[Get]]属性の読み込み時に呼び出す関数です.デフォルトはundefinedです.
  • [[Set]:属性の書き込み時に呼び出す関数です.デフォルトはundefinedです.
  • アクセス器のプロパティは直接定義できません.Object.defineProperty()を使用して定義しなければなりません.
    var book = {_year:2003,edition:5};
    Object.defineProperty(book,"year",{
    	get:function(){
    		return this._year;
    	},
    	set:function(newValue){
    		this._year = newValue;
    		this.edition +=newValue-2003;
    	}
    });
    book.year = 2014;
    document.write("book.edition: " + book.edition);
     3、属性を読み取る特性はObject.getOwn PropertyDescriptorメソッドを使用します.eg.
    var book = {
    	_year : 2003,
    	edition : 5
    };
    Object.defineProperties(book, {
    	_year : {
    		writable : false,
    		configurable : false
    	},
    	year : {
    		get : function() {
    			return this._year;
    		},
    		set : function(newValue) {
    			this._year = newValue;
    			this.edition += newValue - 2003;
    		}
    	}
    });
    book.year = 2014;
    var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
    console.log("descriptor: ",descriptor);
    document.write("book.edition: " + book.edition);