zoukankan      html  css  js  c++  java
  • Javascript高级程序设计——面向对象之理解对象

    在面向对象语言中都有类的概念,通过类来创建具有属性方法对象。而ECMAScript中没有类的概念,ECMAScript中定义了对象:无需属性的集合,其属性值可以包含基本值、对象、或者函数。

    在Javascript中每个对象都是基础引用类型来创建的,可以是原生类型也可以是自定义的类型。

        自定义对象最简单的方法就是通过创建Object类型的实例,然后为这个实例添加属性和方法。

    var Person = new Object();

    Person.name = "yangxunwu";

    Person.age = 24;

    Person.sayName = function(){

    alert(this.name);

    };

     

    我们这里创建了一个object类型的一个名为Person的对象,有两个属性name和age,一个方法sayName;

    属性类型:

    对象拥有属性,这些属性也有一些特性,比如Configurable、Enumerable、Writable、Value。在javascript不能直接访问这些特性,需通过对象的方法访问,比如Object.defineProperty()

    数据属性:数据属性包含这个数据值的位置,在这个位置可以读取和写入值。数据属性有四个特性:

    Configurable:能否通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。

    Enumerable:能否通过for-in循环返回属性。

    Writable:能否修改属性值。

    Value:保持这个属性的数据值。

    var Person = {

            name: "yangxunwu",

    }

    Object.defineProperty(Person, "age", {

            writable: false,

            value: 24

    })

        定义一个Person对象,并设置一个不可写的值为24的age属性。注意定义属性时的属性字符串形式。当把属性的configurable特性设置为false时,无法在次修改,只能使用writable。

    访问器属性:    访问器属性不包含值,包含一对getter和setter函数,访问访问器属性时调用getter函数,这个函数返回有效的值,写入访问器属性时调用setter函数,并传入新值。访问器属性包含四个特性:

        Configurable:能否通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为数据属性。

    Enumerable:能否通过for-in循环返回属性。

    Get:读取数据时调用的函数。默认undefined

    Set:写入属性时调用的函数。默认undefined

    var Person = {

    _year : 1992,

    age : 0

    }

     

    Object.defineProperty(Person, "year", {

    get: function(){

         return this._year;

    },

     

    set: function(newValue){

    if(newValue > 1992){

         this._year = newValue;

    this.age = newValue - 1992;

    }

    }

    })

        

    给Person对象,定义了一个访问器属性year,访问时返回对象的__year属性,赋值时会调用set函数,然后同时设置age的值。

    部分浏览器也可以通过_defineGetter__和 __defineSetter__来设置访问器特性。也可以设置多个特性Object.defineProperties()。要读取一个属性的特性,可以通过给定属性的描述符。

        Object.getOwnPropertyDescriptor()方法,返回一个对象,包含各种特性的属性,可以针对BOM和DOM对象来使用。

        ECMAScript定义这些特性的目的是为了实现Javascript引擎用的

  • 相关阅读:
    main函数的实现解析
    srand()和rand()函数的使用
    shell编程总结
    自动创建字符设备,不需mknod
    linux使用i/o内存访问外设
    Flink之state processor api原理
    Flink之state processor api实践
    软件架构被高估,清晰简单的设计被低估
    技术架构的战略和战术
    Flink task之间的数据交换
  • 原文地址:https://www.cnblogs.com/yangxunwu1992/p/4780115.html
Copyright © 2011-2022 走看看