原型(Prototype)

1.理解原型对象

每当代码读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。捜索首先从对象实例本身开始。如果在实例中找到了具有给定名字的属性,则返冋该属性的值;如果没有找到,则继续搜索指针指向的原型对象.在原型对象中査找具有给定名字的属性。如果在原型对象中找到了这个属性,则返该属性的值。也就足说在我们调用perscml.sayName()的时候.会先后执行两次搜索。首先,解析器会问:“实例personl有sayName属性吗? ”答:“没有。”然后,它继续搜索,再 问:personl的原型有sayName属性吗? ”答:“有。”于是,它就读取那个保存在原型对象中的函 数。当我们调用Person2.sayName()时,将会重现相同的搜索过程,得到相同的结果。而这正是多个对象实例共享原型所保存的属性和方法的基本原理。

2.原型模式的问题

原型模式也不是没有缺点的。首先它省略了构造函数初始化参数这一环节,结果所有的实例在默认情况下都将取得相同的属性值。虽然这会在一定程度上造成不便,但这不是原型的最大问题。原型模式最大的问题是由其共享的本性所导致的。

原型中所有的属性是被所有实例所共享的。这种共享对函数而言非常合适。对于那些包含基本值的属性倒也说的过去,毕竟,通过在实例上添加一个同名的属性,可以隐藏原型中的对应属性。然而,对于包含引用类型的属性来说问题就比较突出了。

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

创建自定义类型的最常见模式,就是组合使用构造函数模式和原型模式,构造函数用与定义实例属性,原型用于定义函数和共享的属性。这样,每个实例都有自己的实例属性副本,但同时又共享对方法的引用,最大限度节省了内存。

        //组合使用构造函数模式和原型模式
        //每个实例既可以有自己的属性,同时又共享这方法,最大限度节省了内存
        function Person(name, age, job) {
            this.Name = name
            this.Age = age;
            this.Job = job;
        }

        Person.prototype = {
            constructor: Person,
            SayName: function () {
                console.log("Name:" + this.Name + ",Age:" + this.Age + ",Job:" + this.Job);
            }
        }

        var jack = new Person("Jack", 18, "Student");
        var Scott = new Person("Scott", 40, "Teacher");
        jack.SayName();
        Scott.SayName();
        console.log(jack.Name + "_" + Scott.Name);

以上内容来自《JavaScript高级程序设计(第3版)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值