码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript高级程序设计: 面向对象编程

时间:2015-02-04 14:31:14      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

工厂模式

工厂模式虽然解决了创建多个相似对象的问题,但没有解决对象识别问题.

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(‘Alice‘,23,‘PHP Engineer‘);
person1.sayName();

构造函数

构造函数的特征:

  1. 没有显示地创建对象
  2. 直接将属性和方法都赋值给this对象
  3. 没有return语句
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(‘Alice‘,23,‘PHP Engineer‘);
person1.sayName();

构造函数与其他函数的唯一区别,就在于他们的调用方式不同.任何函数只要通过new来调用,那他就可以作为构造函数.

使用构造函数的问题

构造函数模式虽然好用,但构造函数内定义的方法要在每一个实例上重新创建一次.例如定义一个person1,person2,都有一个名为 sayName 的方法,但这个两方法不是同一个 Function 的实例.不同实例上的同名函数是不相等的.

console.log( person1.sayName == person2.sayName )

原型模式

我们创建的每个函数都有一个原型属性,这个属性是一个指针,指向一个对象.而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法.

person = new Person();

Person.prototype = {
    
    constructor: ‘Person‘,
    name: ‘Haw‘,
    age: 31,
    job: ‘Software Engineer‘,
    sayName: function(){

            console.log(this.name);
    }
};

var person1 = new Person();
person1.name = ‘Sam‘

原型对象的问题

原型中的所有属性是被很多实例共享的,对于包含引用类型值的属性来说,就产生问题了.

function Person(){

}

Person.prototype = {

    constructor: Person,
    name: ‘Michel‘,
    age: 25,
    job: ‘Software Engineer‘,
    friends: [‘Shelby‘,‘Court‘],
    sayName: function(){

        console.log( this.name );
    }
};

var person1 = new Person();
var person2 = new Person();
person1.friends.push(‘Van‘);
console.log( person2.friends );
 ["Shelby", "Court", "Van"]

person1对friends数组的修改影响到了person2

组合使用构造函数模式和原型模式

创建自定义类型最常见的方式,就是组合使用构造函数模式和原型模式.

  1. 构造函数模式: 定义实例属性
  2. 原型模式: 定义方法和实例共享的属性
function Person( name , age , job ){

    this.name = name;
    this.age = age;
    this.job = job;
    this.friends = [];
}

Person.prototype = {

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

var person1 = new Person(‘Micholas‘,29,‘Software Engineer‘);
var person2 = new Person(‘Greg‘,27,‘Doctor‘);

person1.friends.push(‘Alice‘,‘Sam‘);
person2.friends.push(‘Bob‘);

console.log( person1.friends , person2.friends );
 ["Alice", "Sam"] ["Bob"]

寄生构造函数模式

创建一个函数,这个函数的作用仅仅是封装创建对象代码,然后返回新创建的对象.

function Person(  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 friend = new Person(‘Micholas‘,29,‘Software Engineer‘);
friend.sayName();

除了使用new操作符并把使用的包装函数叫做构造函数之外,这个函数跟工厂模式其实是一模一样的.

function SpecialArray(){

    var values = new Array();

    values.push.apply( values , arguments );

    values.toPipeString = function(){

        return this.join("|");
    };

    return values;
}

var colors = new SpecialArray(‘red‘,‘blue‘,‘green‘);
console.log( colors.toPipeString() );
 red|blue|green

上例中,我们创建了一个具有特殊方法的数组,但是不能直接修改Array构造函数,因此同样使用了寄生构造模式. 关于寄生构造模式,返回的对象与构造函数或者与构造函数的原型属性没有关系.也就是说,构造函数返回的对象与 在构造函数外部创建的对象没有什么不同.为此不能依赖 instanceof 操作符来确定对象类型.

JavaScript高级程序设计: 面向对象编程

标签:

原文地址:http://www.cnblogs.com/yangke687/p/4272096.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!