javascript高级程序设计笔记

面向对象

对象的定义

对象是无序属性的集合,其属性可以包含基本值,对象,或者函数。对象的每个属性或方法都有一个名字,而每个名字都印射一个值。

创建对象的方式

通过new关键字创建一个Object实例

    var person = new Object();
    person.name = 'Nicholas';
    person.age = 29;
    person.job = 'WEB';

    person.sayName = function(){
        console.log(this.name);
        // Nicholas
    }

字面量创建一个对象

    var person = {
        name : 'Nicholas';
        age : 29;
        job : 'WEB';

        sayName : function(){
            console.log(this.name);
        }
    }

数据属性

数据属性包含一个数值的位置,在这个位置可以读取和写入值,数据属性有4个描述其行为的特性。

  • [[Configurable]]: 表示能否通过delete删除属性而重新定义属性,能否修改属性的特性,或者能否把属性
    修改为访问器属性。通过字面量定义的属性,他们的这个特性默认值为true。

  • [[Enumerable]]: 表示能够通过for-in循环返回属性。通过字面量定义的属性,他们这个特性默认值为true。

  • [[Writable]] : 表示能否修改属性的值。通过字面量定义的属性,他们这个特性默认值为true。

  • [[Value]]: 包含这个属性的值。读取属性的时候,从这个位置读,写入属性值的时候把新值保存在这个位置。
    这个特性的默认值为undefined。

要修改属性默认的特性,必须使用ECMAScript5的Object.definePerty()方法。这个方法接收三个参数:属性
的所在对象,属性的名字和一个描述符对象。其中描述符对象的属性必须是:configurable,enumerable,writable
,value。设置其中的一个或者多个值,可以修改对象的特性值。

    var person = {
    name : 'hello'
    }
    Object.defineProperty(person,'name',{
        configurable :false,
        writable :false,
    })
    person.name = 'world';
    console.log(person.name);
    // hello

这里创建了一个person的对象,其名为name的属性为'hello',下面通过Object.defineProperty()方法设置
person.name的值为可读的,所以62行的赋值语句会被忽略;在严格模式下,赋值操作会导致抛出错误。

设计模式

工厂模式

工厂模式抽象了创建具体对象的过程,利用函数来封装以特定接口创建对象的细节

    function createPerson(name,age,job){
        var o = new Object();
        o.name = name;
        o.age = age;
        o.job = job;
        o.sayName = function(){
            console.log(this.name);
        }
        return o;
    }

    var person1 = createPerson('zhangsan',22,'web');
    var person2 = createPerson('lisi',22,'java');

函数createPerson()能够根据接收的参数来构建一个包含所有必要信息的Person对象。可以无数次调用这个函数
,而每次它都会返回一个包含三个属性一个方法的对象。

构造函数模式

    function Person(name,age,job){
        this.name = name;
        this.age = age;
        this.job = job;
        this.sayName = function(){
            console.log(this.name);
        }
    }

    var person1 = new Person('zhangsan',22,'web');
    var person2 = new Person('lisi'23,'net');

这里的构造函数模式与工厂模式的区别

  • 没有显式地创建对象;
  • 直接将属性和方法赋值给this对象
  • 没有return语句

*** 按照惯例,构造函数始终都应该以一个大写字母开头 ***

要创建Person新的实例,必须使用new操作符,以这种方式调用构造函数会经历一下4个步骤

  • 创建一个新的对象
  • 将构造函数的作用域赋给新对象(此时this指向了新对象)
  • 执行构造函数中的代码
  • 返回新的对象

person1,person2分别保存着Person的不同实例。着两个对象都有一个constructor(构造函数)属性
,该属性指向Person。

检测对象类型用instanceof,在上面的例子中所有对象都是Object的实例,同时也是Person的实例

    console.log(person1 instanceof Object); //true
    console.log(person1 instanceof Person); //true

原型模式

posted @ 2016-11-29 18:16  zone01  阅读(120)  评论(0)    收藏  举报