第六章 面向对象的程序设计

来源:互联网 发布:js 读取 .exe 编辑:程序博客网 时间:2024/06/02 06:14

面向对象(Object-Oriented, OO)的语言有一个标志,就是它们都具有类的概念,而通过这个类可以创建任意多个具有相同属性和方法的对象。

ECMAScript 中没有类的概念,因此它的对象也是基于类的语言中的对象有所不同。尽管从技术上来讲ECMAScript 是一门面向对象的语言,但它不具备传统的面向对象所支持的类和接口等基本结构。

引用类型有时候也被称为对象定义因为它们描述的是一类对象所具有的属性和方法。

ECMAScript-262 把对象定义为:“无需属性的集合,其属性可以包含基本值、对象或者函数”。可以把ECMAScript 的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数

    //一般构造函数    //缺点使用同一个接口创建多个对象,会产生大量重复代码    var person2 = new Object();    person2.name="Nicholas";    person2.age="25";    person2.job="Doctor";    person2.sayPerson1 =function () {        alert(this.name+"、"+this.age+"、"+this.job);//Nicholas 25 Doctor    };    person2.sayPerson1();    //对象字面量    var person3 = {        name:"Jame",        _age:40,        job:"teacher",        level:2    }    Object.defineProperty(person3,"age",{        get:function () {            return this._age;        },        set:function (newAge) {            if(newAge>40){                this._age=newAge;                this.level +=newAge-40;            }        }    })    person3.age=50;    alert(person3.level); //12    //工厂模式    function createPerson(name,age,job) {        var o = new Object();        o.name=this.name;        o.age = this.age;        o.job=this.job;        o.sayPerson=function () {            alert(this.name+"、"+this.age+"、"+this.job)        }        return o;    }    var person1 = createPerson("Nicholas",40,"software engineer");    person1.sayPerson();    //函数构造模式    function Person(name,age,job){ //构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头        this.name=name;        this.age=age;        this.job=job;        this.saySomething=function () {            alert(this.name+"、"+this.age+"、"+this.job);        }    }    //当做构造函数使用    var person=new Person("Tom",20,"software engineer");    person.saySomething();    //当做普通函数使用    Person("lily",20,"Nurse");    window.saySomething();    //在另一函数域中调用    var o=new Object();    Person.call(o,"Nicholas",30,"Doctor");    o.saySomething();

    //构造函数缺点,person1、person2 都有一个名为sayName() 方法,但是两个方法不同的function 实例    function Person(name,age,job) {        this.name=name;        this.age=age;        this.job=job;        this.saySomething=function () { //构造函数内部            alert(this.name+"、"+this.age+"、"+this.job);        }    }    var person1=new Person("Tom",34,"software engineer");    var person2=new Person("ban",34,"software engineer");    person1.saySomething();    person2.saySomething();    alert(person1.saySomething == person2.saySomething); //false    //创建连个Function 实例是没有必要的,可以通过函数定义转移到构造函数外部来解决问题    //缺点:在全局作用域中定义的函数实际上只能被某个对象调用,这让全局变量名副其实。而且如果需要定义多个方法,那么就要定义多个全局变量    function Person1(name,age,sex) {        this.name=name;        this.age=age;        this.sex=sex;        this.sayPerson1=sayPerson1; //sayName() 函数的定义转义到构造函数外部    }    function sayPerson1() { //外部        alert(this.name+"、"+this.age+"、"+this.sex);    }    var person3=new Person1("Tom",34,"female");    var person4=new Person1("ban",34,"female");    person3.sayPerson1();    person4.sayPerson1();    alert(person3.sayPerson1 == person4.sayPerson1);
    //每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法    function Person() {    }    Person.prototype.name="Nicholas";    Person.prototype.age="29";    Person.prototype.job="software engineer";    Person.prototype.sayName=function () {        alert(this.name);    };    var person1 = new Person();    person1.sayName();    var person2= new  Person();    person2.sayName();    alert(person1.sayName == person2.sayName);


只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个 prototype 属性,这个属性指向函数的原型对象。在默认情况下,所有原型对象都会自动获得一个 constructor (构造函数)属性,这个属性是一个指向 prototype 属性所在函数的指针。







0 0
原创粉丝点击