面向对象的程序设计(JS)

1    创建自定义对象,再添加属性和方法同时带有一些特征值,而JavaScript解释通过这些特征值定义它们的行为的。那么就有这三个方法是对属性的特征行为读写:

//描述符对象(configurable、enumerable、writrable和value)无法直接使用需要用下面的方法操作;
 Object.defienProprety();//对属性的特性行为操作,三个参数:属性所在的对象、属性的名字,一个描述符对象;
 Object.definenProperties();//通过描述符定义多个属性,两个参数:要添加和修改属性的对象,对第一个参数对应的变动的值;
 Object.getOwnPropertyDescriptor();//取给定属性的描述符,两个参数属性所在的对象,要读取其描述符的属性名称;

2  工厂模式:用函数来封装以特定接口创建对象的细节

function createPerson(name, age, job) {
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function (){
        alert(this.name);
    };
    return o;        
}    
var person1 = createPerson("Tom", 22, "Student");
var person2 = createPerson("Greg", 24, "Doctor");

  函数creatPerson()能够根据接收的参数来构建一个包含所有必要信息的Person对象。每次调用就每次返回一个包含三个属性一个方法的对象。

  工厂模式虽然解决了创建的多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型),

3  构造函数模式:创建特定的类型的对象

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function (){
       alert(this.name);    
  };    
}
var person1 = new Person("Tom", 22, "student");
var person2 = new Person("Greg", 24, "Doctor");

  其中没有显示对象,直接将属性和方法赋值了this对象保存,没有return语句(构造函数相似不反回值下,默认返回新对象实例);

  注意创建Person新实例,必须用 new 操作符,由此调用构造函数会经历4个步骤:

    (1)创建一个对象;

    (2)将构造函数的作用域赋给新的对象(因此this就只想了这个新对象);

    (3)执行构造函数中的代码(为这个新对象添加属性);

    (4)返回新对象;

  缺点:每个方法都要在每个实例上重新创建一遍。

4  原型模式:每个函数都有一个prototype(原型)属性,将信息直接添加到原型对象中,在共享

function Person() {}
Person.prototype.name = "Tom";
Person.prototype.age = 22;
Person.prototype.job = "student";
Person.prototype.sayName = function (){
  alert(this.name);  
};
var person1 = new Person();
person1.sayName(); //"Tom"
var person2 = new Person();
person2.sayName(); //"Tom"
alert(person1.sayName == person2.sayName); //true

  将sayName()方法和所有属性直接添加到了Person的prototype属性中,构造函数变成了空函数,但是仍可调用构造函数创建,并新对象拥有相同的属性和方法。

5  动态原型模式:通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型

function Person(name, age, job){
  //属性
  this.name = name;    
  this.age = age;
  this.job = job;
  //方法
  if (typeof this.sayName != "function"){
        Person.prototype.sayName = function (){    
            alert(this.name);
        }
    }  
}
var friend = new Person("Tom", 22, "student");
friend.sayName();

  注意在加粗的部分,需要sayName()不存在下,才能添加到原型中。在初次调用执行就会完成初始化,这里对原型所做的修改,都能立即在所有实例中得到反映。

  使用动态原型模式时,不能使用对象字面量重写原型,否则会切断现有实例与新原型之间的联系。

6  寄生构造函数模式:基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后返回新创建的对象(类似典型构造函数)

function Person(name, age, job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function (){
        alert(this.name);    
    };
    return o;
}
var friend = new Person("Tom", 22, "student");
friend.sayName(); //"Tom"

  除了new操作符把使用包装函数叫做构造函数外,就是工厂模式。返回的对象与构造函数或构造函数的原型属性之间没有关系。

7  稳妥构造函数模式:类似寄生模式,但不引用this,也不用new操作符调用构造函数

function Person(name, age, job){
    //创建要返回的对象
    var o = new Object();
    //可以定义私有书变量和函数
   
    //添加方法  
    o.sayName = function (){
        alert(name);    
    };
    //返回对象
    return o;
}
//注意,这个模式对象中,除了sayName()方法外,就无法访问name的值;可以像下使用
var friend = new Person("Tom", 22, "student");
friend.sayName(); //"Tom"    

  变量friend中保存的是一个稳妥对象,除了调用sayName()方法外,没有其他方法可以访问其数据成员。适合在安全执行环境。

 

个人笔记,有点乱,有错望指正!

 

posted @ 2017-09-17 18:57  非零对象  阅读(183)  评论(0编辑  收藏  举报