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);
相关文章
相关标签/搜索