js对象和属性的基本定义

(function(){
    $(document).ready(function(){
        return "object define";
        //创建对象实例
        var person = new Object();
        person.name = "Nicholas";
        person.age = 29;
        person.job = "Software Engineer";
        person.sayName = function(){
            alert(this.name);//this代表的是本对象,就是调用这个方法的对象person
        };
        //常用的对象字面量语法
        var person = {
            name : "Nicholas",
            age : 29,
            job : "Software Engineer",
            //最后一个属性,不需要加逗号
            sayName : function(){
                        alert(this.name);
                    }
        };
    });
})();

属性类型的基本应用

1、数据属性

(function(){
    return;
    $(document).ready(function(){
    //对象的属性类型(property) 数据属性和访问器属性
    //数据属性
    //[[Configurable]]  : 是否可以通过delete 删除属性从而重新定义、能否修改属性的特性,或者把属性改为访问器属性
    //[[Enumerable]] : 表示能否用for-In 循环返回属性
    //[[Writable]] : 表示是否可以修改属性的值
    //[[Value]] : 保存这个属性的值。  这个值默认为undefined
    /*
    **直接在对象上定义的属性,  他们的数据属性,[[Configurable]] [[Enumerable]] [[Writable]]  默认都为false  [[Value]]  则为设置的值
    **
    */
    var person = {};
    //参数为,  对象、属性、描述符对象
    Object.defineProperty(
        person,
        "name",
        {
            writable:false,  //person对象的属性name的值不允许修改,为只读
            value : "Nicholas"
        }
    );
    person.name = "Greg"; //name 为只读,非严格模式下会忽略, 严格模式下会报错
    console.log(person.name);//  "Nicholas"
    Object.defineProperty(
            person,
            "age",
            {
                configurable:false,
                value:25,
                writable : false,
                enumerable:false
            }
        );
    console.log("删除属性age前的值:"+person.age);
    delete person.age;
    console.log("删除属性age后的值:"+person.age);//configurable 设置了false,此属性age不可更改,不能删除
    try{
        Object.defineProperty(
                person,
                "age",
                {
                    configurable:true,
                    value : 33
                }
        ); //严 格模式下会报错

    }
    catch(e){
        console.log("定义的age属性的configurable为不可以修改,所以不能重新修改属性的配置,也不能删除"+e.message);
    }
    console.log("age1:"+person.age);
    person.age = 44;
    console.log("age2:"+person.age);
    try{
    Object.defineProperty(
            person,
            "age",
            {
                writable:true,
                value : 34
            }
        );
    }
    catch(e)
    {
        console.log("定义的age属性的configurable为不可以修改,所以不能重新修改属性的配置,也不能修改writable属性"+e.message);
    }
    person.age=44;
    console.log("age3:"+person.age);
    console.log("===========");
    try{
        Object.defineProperty(
                person,
                "age",
                {
                    enumerable:true
                }
            );
    }
    catch(e)
    {
        console.log("定义的age属性的configurable为不可以修改,所以不能重新修改属性的配置,也不能修改enumerable属性"+e.message);
    }
    Object.defineProperty(
            person,
            "job",
            {
                enumerable:true,
                value :""
            }
        );
    for(var property in person)
    {
        console.log("person对象的属性有:" + property);
    }
    console.log("age属性设置了不可枚举和name属性可枚举默认为false,所以只有job设置了可枚举的数据属性。");
    });
})();

2、访问器属性

(function(){
    /*访问器属性 getter和setter两个函数
    [[Configurable]] :同“数据属性”的解释
    [[Enumerable]] :同“数据属性”的解释
    [[Get]]:读取属性时的值 默认值为undefined; 设置之后表示可读。
    [[Set]]:写入设置时属性的值 默认值 undefined; 设置之后表示可写。
    [[Get]] / [[Set]] 只能在Object.defineProperty();中定义
    */
    $(document).ready(function(){
        var book = {
            _year:2004,//加_标记的时候,一般表示只能通过对象中的方法访问,不使用直接访问方式。如getyear();  这个常用的标记。
            edition:1,
            num:2,
            getyear:function(){
                return this._year;
            }

        };//此定义是数据属性方式的定义;
        Object.defineProperty(
            book,
            "year",
            {
                get:function(){
                    return this._year;//this代表的是本对象,就是调用这个方法的对象book
                },
                set:function(value){
                    if(value > 2004)
                    {
                        this._year = value;
                        this.edition = this.edition + value - 2004;
                    }
                }
            }
        );
        book.year = 2006;
        console.log("book.edition:"+book.edition);
        console.log("book._year:"+book.getyear());
        // 严格模式下。如果只设置了get属性,为只读,做写入操作会报错。只设置set属性,为只写不可读,做读取操作的时候会报错 。
        //非严格模式下,只写的属性,读取的时候返回undefined。
        Object.defineProperty(
            book,
            "author",
            {
                set:function(value){
                    this.author = value;
                }
            }
        );
        console.log(book.author);//undefined
        //ECMAScript 5之前有访问器属性的两个非标准的方法: _defineGetter_  和  _defineSetter_
        console.log("ECMAScript 5之前有访问器属性的两个非标准的方法: _defineGetter_  和  _defineSetter_");
        book.__defineGetter__("pageNum",function(){
            return this.num;
        });
        book.__defineSetter__("pageNum",function(value){
            this.num = value;
        });//set 不能设置本属性的值。否则造成循环设置。内存溢出。
        console.log("book.pageNum:"+book.pageNum);
        book.pageNum = 500;
        console.log("book.pageNum:"+book.pageNum);
        //设置多个属性值,数据属性和访问器属性可以一起用。
        var person = {};
        Object.defineProperties(
            person,
            {
                _name : {
                    value : "Nicholas",
                    writable:true
                },
                age :{
                    value:33
                },
                name :{
                    get:function(){
                        return this._name;
                    },
                    set:function(value){
                        this._name = value;//必须设置writable  = true 才能修改_name的值
                    }
                }
            }
        );
        console.log(person._name); //Nicholas
        console.log(person.age);
        person.name = "Greg";
        console.log(person._name); //Greg
        //读取属性的特性
        console.log("读取属性的特性");
        var descriptor = Object.getOwnPropertyDescriptor(person,"_name");
        console.log(descriptor.value); // Greg
        console.log(descriptor.configurable); //false;
        console.log(descriptor.get); //undefined
        console.log(descriptor.set); //undefined
        console.log(descriptor.writable); //true
        console.log(descriptor.enumerable);//false

    });
})();

JavaScript 对象的基本知识的更多相关文章

  1. javascript——对象的基础知识

    一.javascript作为脚本语言可以完成以下任务: 操纵浏览器对象,如窗口的打开与关闭: 操纵Dom树: 通过XMLHttpRequest对象与服务器端进行异步通信: XML编程,借助于Activ ...

  2. JavaScript对象属性的基础教程指南

    JavaScript是使用“对象化编程”的,或者叫“面向对象编程”的.所谓“对象化编程”,意思是把JavaScript能涉及的范围划分成大大小小的对象,对象下面还继续划分对象直至非常详细为止,所有的编 ...

  3. JavaScript对象基础知识总结

    1.什么叫JavaScript对象? 定义:名值对的集合.简单的讲就是容纳属性值和属性值的容器,这些属性可以是无序的,基本上JavaScript中所有的事物都可以看成对象. 拓展:我们经常说,数组也是 ...

  4. 摘:JavaScript性能优化小知识总结

    原文地址:http://www.codeceo.com/article/javascript-performance-tips.html JavaScript的性能问题不容小觑,这就需要我们开发人员在 ...

  5. javascript对象的一点理解

    <script type="text/javascript"> /* js对象:对象的职责是调用属性和调用方法 */ //1.对象的创建的三种方式 var obj = ...

  6. 关于JavaScipt对象的基本知识

    关于JavaScipt对象的基本知识 JavaScript是运用“对象化编程”的,又叫“面向对象编程”的.所谓“对象化编程”,意义是把JavaScript能涉及的领域划分成各种对象,对象后面还连续划分 ...

  7. Javascript对象属性与方法汇总

    Javascript对象属性与方法汇总 发布时间:2015-03-06 编辑:www.jquerycn.cn 详细介绍下,javascript对象属性与对象方法的相关知识,包括javascript字符 ...

  8. 【知了堂学习笔记】/JavaScript对象--/暖妮

    JavaScript对象 1.什么是JavaScript对象? JavaScript 中的所有事物都是对象:字符串.数字.数组.日期,等等. 在 JavaScript 中,对象是拥有属性和方法的数据. ...

  9. 第五章 JavaScript对象及初识面向对象

    第五章   JavaScript对象及初识面向对象 一.对象 在JavaScript中,所有事物都是对象,如字符串.数值.数组.函数等. 在JavaScript对象分为内置对象和自定义对象,要处理一些 ...

随机推荐

  1. 置入式模型inclusion model和显示具现化

    1.置入式模型 链接错误: 大多数非模板程序代码的组织如下:A,类声明在头文件中: B:全局变量和非inline函数在cpp文件中定义 但是,如果模板程序也这样组织,则会出错.原因在于:函数模板的定义 ...

  2. Winodow Server Backup学习向导-window 2008

    1.安装Window Server Backup 2.备份服务器 3.恢复服务器 4.优化和备份服务器性能 Windows Server Backup 中的新增功能有哪些? Windows Serve ...

  3. Thread and ThreadPool

    C#中Thread与ThreadPool的比较 Thread类,一次使用一个线程,来创建和删除线程.这种方式建立和删除线程是很昂贵的(cpu密集型). Threadpool类 对于大多数的情况下是使用 ...

  4. 关于JS Date 时间计算

    倒计时功能Demo:http://play.163.com/special/test-timeending/?1465197963677 获取时间 Date() 返回当日的日期和时间. getDate ...

  5. [转]Java学习日记之 volatile

    用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...

  6. thinkphp学习笔记(一)

    一.入门与安装 1.进入C:\Windows\System32\drivers\etc的hosts文件中增加127.0.0.1 www.tp5.com 即访问这个域名就相当于访问127.0.0.1 2 ...

  7. 工作随笔——Swift中的Range和一些字符操作

    截取字符串在Swift中相比OC要复杂很多,主要原因可能还是OC的NSRange的创建方法中参数类型为int,而Swift却对类型要求很严格,int不能作为参数创建Range,这要使用String中的 ...

  8. wireshark长时间抓包分多个文件

    前言 说一说这个问题的由来,一般使用wireshark不需要长时间抓包的,但是有时候遇到网络通信中非常棘手的问题,例如一个小时出现一次或者几个小时出现一次问题的情况,这种情况下就必须长时间抓包了.但是 ...

  9. PostgreSQL基础整理(二)

    存储过程 实现功能:针对工资表30岁以下,工资提升10% 30至40提升20% 40以上提升30% + 奖金(入参)返回平均薪酬 创建表: DROP TABLE emps; CREATE TABLE ...

  10. mongodb(回滚)

    事实上mongodb是不支持事务的,个人理解原因如下:1.避免大量对document加锁,从而影响性能,2.非关系型的数据库,从设计上就应能尽可能的比较关联复杂的多document,一个数据应能记录在 ...