zoukankan      html  css  js  c++  java
  • js.面向对象

    一、理解对象:

    第一种:基于Object对象

    var person = new Object();
    person.name = 'My Name';
    person.age = 18;
    person.getName = function(){
        return this.name;
    

    第二种:对象字面量方式(比较清楚的查找对象包含的属性及方法)

    var person = {
        name : 'My name',
        age : 18,
        getName : function(){
            return this.name;
        }
    }
    

    JS的对象可以使用‘.’操作符动态的扩展其属性,可以使用’delete’操作符或将属性值设置为’undefined’来删除属性。如下:

    person.newAtt=’new Attr’;//添加属性
    alert(person.newAtt);//new Attr
    delete person.age;
    alert(person.age);//undefined(删除属性后值为undefined);
    

    二、对象属性类型

    1、数据属性:

    数据属性指包含一个数据值的位置,可在该位置读取或写入值,该属性有4个供述其行为的特性:

      [[configurable]]:表示能否使用delete操作符删除从而重新定义,或能否修改为访问器属性。默认为true;
    
      [[Enumberable]]:表示是否可通过for-in循环返回属性。默认true;
    
      [[Writable]]:表示是否可修改属性的值。默认true;
    
      [[Value]]:包含该属性的数据值。读取/写入都是该值。默认为undefined;如上面实例对象person中定义了name属性,其值为’My name’,对该值的修改都反正在这个位置
    

    var person = {};
    Object.defineProperty(person, 'name', {
        configurable: false,
        writable: false,
        value: 'Jack'
    });
    alert(person.name);//Jack
    delete person.name;
    person.name = 'lily';
    alert(person.name);//Jack
      可以看出,delete及重置person.name的值都没有生效,这就是因为调用defineProperty函数修改了对象属性的特征;值得注意的是一旦将configurable设置为false,则无法再使用defineProperty将其修改为true(执行会报错:can't redefine non-configurable property);
    

    2、访问器属性:

      它主要包括一对getter和setter函数,在读取访问器属性时,会调用getter返回有效值;写入访问器属性时,调用setter,写入新值;该属性有以下4个特征:
    
      [[Configurable]]:是否可通过delete操作符删除重新定义属性;
    
      [[Numberable]]:是否可通过for-in循环查找该属性;
    
      [[Get]]:读取属性时调用,默认:undefined;
    
      [[Set]]:写入属性时调用,默认:undefined;
    

    访问器属性不能直接定义,必须使用defineProperty()来定义,如下:

    var person = {
        _age: 18
    };
    Object.defineProperty(person, 'isAdult', {
        get: function () {
            if (this._age >= 18) {
                return true;
            } else {
                return false;
            }
        }
    });
    alert(person.isAdult?'成年':'未成年');//成年
    

    var person = {};
    Object.defineProperties(person,{
        _age:{
            value:19
        },
        isAdult:{
            get: function () {
                if (this._age >= 18) {
                    return true;
                } else {
                    return false;
                }
            }
        }
    });
    alert(person.isAdult?'成年':'未成年');//成年
    

    此外,使用Object.getOwnPropertyDescriptor()方法可以取得给定属性的特性:


    var descriptor = Object.getOwnPropertyDescriptor(person,'_age');
    alert(descriptor.value);//19
       对于数据属性,可以取得:configurable,enumberable,writable和value;
    
       对于访问器属性,可以取得:configurable,enumberable,get和set
    

    三、创建对象

    使用Object构造函数或对象字面量都可以创建对象,但缺点是创建多个对象时,会产生大量的重复代码,因此下面介绍可解决这个问题的创建对象的方法

    1、工厂模式

    function createPerson(name, age, job) {
        var o = new Object();
        o.name = name;
        o.age = age;
        o.job = job;
        o.getName = function () {
            return this.name;
        }
        return o;//使用return返回生成的对象实例
    }
    var person = createPerson('Jack', 19, 'SoftWare Engineer');
     创建对象交给一个工厂方法来实现,可以传递参数,但主要缺点是无法识别对象类型,因为创建对象都是使用Object的原生构造函数来完成的。
    

    2、构造函数模式

    function Person(name,age,job){
        this.name = name;
        this.age = age;
        this.job = job;
        this.getName = function () {
            return this.name;
        }
    }
    var person1 = new Person('Jack', 19, 'SoftWare Engineer');
    
    var person2 = new Person('Liye', 23, 'Mechanical Engineer');
    

     使用自定义的构造函数(与普通函数一样,只是用它来创建对象),定义对象类型(如:Person)的属性和方法。它与工厂方法区别在于:
  • 相关阅读:
    洛谷 P2607 [ZJOI2008]骑士(基环树、树形dp)
    洛谷 P1453 城市环路(基环树,树形dp)
    基环树学习笔记 & CF711D Directed Roads
    centos7 系统安全加固方案
    来自后端的突袭? --开包即食的教程带你浅尝最新开源的C# Web引擎 Blazor
    作为一个C#程序员, 你应该上手Kotlin
    python中类和self讲解
    Mysql 存储引擎中InnoDB与Myisam的主要区别
    Apache和Nginx的区别
    PHP超全局变量
  • 原文地址:https://www.cnblogs.com/GJcaowei/p/7192150.html
Copyright © 2011-2022 走看看