js学习笔记(一)对象的属性

js面向对象定义

ECMA-262定义对象:无序的属性集合,其属性可以包含基本值、对象或者函数。

ECMA中有两种属性:数据属性和访问器属性。

1、数据属性

对象属性的默认特性(只为js引擎使用)包含:

[[Configurable]]:描述属性能否被修改,默认值true;

[[Enumberable]]:表示能否通过for-in循环属性,默认值true;

[[Writable]]:表示能否修改属性的值。默认值true;

[[Value]]:包含属性的数据值。默认值undefined;

  要修改属性默认的特性,必须使用Object.defineProperty()方法。

        var person = {};
        Object.defineProperty(person,"name",{
            writable:false,
            value:"zyl"
        });
        console.log(person.name);
        person.name = "zhang";
        console.log(person.name);

  显示的结果:第一个:zyl,第二个:zyl

  说明person对象的属性name是一个只读的属性。

  在调用Object.defineProperty时,如果不置顶特性描述,则默认都为true。

  Object.defineProperty不常用,可以用来理解javascript对象。

  注意:ie8是第一个实现该方法的浏览器版本。但是,ie8只针对dom对象可用。建议不要使用!!

2.访问器属性

        var book = {
            _year:2004,
                edit:1
        };
        Object.defineProperty(book,"year",{
            get:function(){
                return this._year;
            },
            set:function(newValue){
                if(newValue>2004){
                    this._year = newValue;
                    this.edit += newValue -2004;
                }
            }
        });
        book.year = 2005;
        console.log(book._year);//2005
        console.log(book.year);//2005
        console.log(len(book));//2    year不是book的真实属性,是访问器属性
        console.log(book.edit);//2
        function len(obj){
            var flag = 0
            for(var i in obj){
                flag++;
            }
            return flag;
        }
原文地址:https://www.cnblogs.com/zhangyanlei183/p/5017006.html