javascript -- 面向对象(一)

一、理解对象

  “万物皆对象”,所谓对象,就是拥有自己的属性和方法的数据。最简单的是通过以下两种方式来定义对象

<script>
		//一、开始的模式,通过初实例化一个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();
		//二、 字面量形式创建对象,说明白点就是json形式的数据
		var person={
			name: 'jiang2',
			age: 29,
			job: 'software engineer',
			sayName: function(){
				console.log(this.name);
			}
		}
		person.sayName();
<script>

二、属性类型

1. 数据属性含义:包含一个数据值的位置,在这个位置上可以读取和写入值,数据属性有4个描述行为的特征,分别是configurable、enumerable、writable、value。

  configurable:能否通过delete删除属性从而重新定义属性,能否修改属性的特征或者修改为访问其属性,其默认值为true

  enumerable:表示能否通过for-in循环番薯属性,默认为true

  writable: 能否修改属性的值。默认为true

  value:包含这个属性的数据值,其他属性特性都被设置为true,而value特性被设置为指定的值

通过代码来分析属性:

//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. 访问器属性:

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);

 

posted @ 2017-12-08 18:13  _江江江江  阅读(223)  评论(0编辑  收藏  举报