日期:2014-05-16  浏览次数:20408 次

javascript构建对象模式与继承

常见模式:

1、工厂模式

使用简单的函数创建对象,为对象添加属性和方法,然后返回对象。这个模式后来被构造函数模式所取代。

function createPerson(name, age, job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.getName = function(){
        alert(this.name);
    };
    return o;
}

var person = new createPerson("heicx", 28, "programmer");

?

2、构造函数模式

可以创建自定义引用类型,可以像创建内置对象实例一样使用new操作符。不过,构造函数也有缺点,即它的每个成员都无法得到复用,包括函数。由于函数可以不局限于任何对象,因此没有理由不在多个对象间共享函数。

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.getName = function(){
        alert(this.name);
    }
}

var person = new Person("heicx", 28, "programmer");

?

3、原型模式

使用构造函数的prototype属性来指定那些应该共享的属性与方法。组合使用构造函数模式和原型模式时,使用构造函数定义实例属性,而使用原型定义共享的属性和方法。

function Person(){}

Person.prototype.name = "heicx";
Person.prototype.age = 28;
Person.prototype.job = "programmer";
Person.prototype.getName = function(){
    alert(this.name);
}

var person1 = new Person();
person1.getName();    //  "heicx"---来自原型

var person2 = new Person();
person2.name = "jobs";
person2.getName();    //  "jobs"---来自实例

delete person2.name;
person2.getName();   //  "heicx"---来自原型

?

Javascript对象的继承:

Javascript主要通过原型链实现继承。原型链的构建时通过将一个类型的实例赋值给另一个构造函数的原型实现的。这样,子类型就能够访问超类型的所有属性和方法,这一点与基于类的继承很相似。原型链的问题时对象实例共享所有的属性和方法,因此不适宜单独使用。解决这个问题的技术是'借用构造函数',即在子类型构造函数的内部调用超类型构造函数。这样就可以做到每个实例都具有自己的属性,同时还能保证只使用构造函数模式来定义类型。使用最多的继承模式是最合继承,这种模式使用原型链继承共享的属性和方法,而通过调用'借用构造函数'继承实例属性。

1、原型式继承,可以在不必预先定义构造函数的情况下继承,其本质就是执行给定对象的浅复制。而复制得到的副本还可以得到进一步改造。

2、寄生式继承,与原型式继承非常类似,也是基于某个对象或某些信息创建一个对象,然后增强对象,最后返回对象。对了解决组合继承模式由于多次调用超类型构造函数而导致的低效率问题,可以将这个模式与组合继承一起使用。

3,寄生组合式继承,集寄生式继承和组合继承的优点与一身,是实现基于类型构造的最有效方式。

?

?