六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 22|回复: 0

JavaScript面向对象的程序设计3—组合使用构造函数模式和原型模式

[复制链接]

升级  32%

2

主题

2

主题

2

主题

童生

Rank: 1

积分
16
 楼主| 发表于 2013-1-29 09:16:58 | 显示全部楼层 |阅读模式
1. 原型对象的问题
    首先,它省略了为构造函数传递初始化参数这一环节,结果所有实例在默认情况下都将取得相同的属性值。
    最大的问题,由其共享的本质所导致的。
        原型中所有的属性是被很多实例共享的,这种共享对于函数非常合适。
        对于那些基本值的属性也还说的过去,因为可以通过为实例添加一个同名的属性屏蔽掉原型中的属性。
        但是,对于包含引用类型值的属性来说,问题就比较突出了。
    function Person() {}    Person.prototype = {        constructor : Person,        name : "answer",        age : 22,        job : "Software Engineer",        friends : ["xhc", "jmn"],        sayName : function() {            alert(this.name);        }    }    var person1 = new Person();    var person2 = new Person();    person1.friends.push("new");    alert(person1.friends);    //"xhc,jmn,new"    alert(person2.friends);    //"xhc,jmn,new" 一般情况下,不同的实例需要拥有各自不同的全部属性。这个问题,正式很少单独使用原型模式的原因所在。
 
2. 组合使用构造函数模式和原型模式(可作为定义引用类型的一种默认模式)
    创建自定义对象最常见的方式,就是组合使用构造函数模式和原型模式。
    构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。
    因此,每个实例都有各自的一份实例属性的副本,但同时又共享这对方法的引用,最大限度的节省了内存。
    另外这种模式还支持向构造函数传递参数。
    function Person(name, age, job) {        this.name = name;        this.age = age;        this.job = job;        this.friends = ["xhc", "jmn"];    }    Person.prototype = {        constructor : Person,        sayName : function() {            alert(this.name);        }    } 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表