原型链模式基础

40 篇文章 0 订阅
32 篇文章 0 订阅
<script>
            function  CreateJsPerson(name,age) {
                this.name = name;
                this.age = age;  
            }
            CreateJsPerson.prototype.writeJs = function () {
                    console.log("ny name is" + this.name + ",i can write js");
                };
            var p1 = new CreateJsPerson("lala",18);
            var p2 = new CreateJsPerson("dd",19);
            console.log(p1.writeJs===p2.writeJs);//->true
            //构造函数模式中拥有了类和实例的概念,并且实例和实例之间是相互独立开的->实例识别
            //基于构造函数模式的原型模式解决了方法或者属性公有的问题->把实例之间相同的属性和方法提取成公有的属性和方法
            //想让谁公有就把他放在CreateJsPerson.prototype上即可


            //1.每一个函数数据类型(普通函数,类)都有一个天生自带的属性:prototype(原型),并且这个属性是一个对象数据类型的值
            //2.并且在prototype上浏览器天生给他加了一个属性constructor(构造函数),属性值是当前函数(类)本身
            //3.每一个对象数据类型(普通的对象,实例,prototype...)也天生自带一个属性:__proto__,这个属性属性值是当前实例所属类的原型(prototype)
            function Fn() {
                this.x = 100;
                this.sum = function(){};
            }
            Fn.prototype.getX = function () {
                console.log(this.x);   
            };
            Fn.prototype.sum = function () {
                };
            var f1 = new Fn;
            var f2 = new Fn;
            console.log(Fn.prototype.constructor === Fn);//->true
            //Object是js中所有对象数据类型的基类(最顶层的类)
            //1.f1 instanceof Object->true 因为f1通过__photo__可以向上级查找,不管有多少级,最后都能找到Object
            //2.在Object.prototype上没有__photo__这个属性

            //3.原型链模式

            f1.hasOwnProperty("x");//->x是f1的一个属性
            //但是我们发现在f1的私有属性上并没有这个方法,那我们是如何处理的
            //通过 对象名.属性名 的方式获取属性值的时候,首先在对象私有的属性上进行查找,如果私有中存在这个属性,则
            //获取的是私有的属性值,如果私有没有,则通过__photo__找到所属类的原型(累的原型上定义的属性和方法都是当前
            //实例公有的属性和方法),原型上存在的话,获取的是公有的属性值;如果原型上也没有,则继续通过原型上的__photo__
            //继续向上查找,一直找到Object.prototype为止....
            //这种查找机制,就是我们的原型链模式
            // f1.getX===f2.getX ->true
            // f1.__photo__.getX===f2.getX ->true
            // f1.getX===Fn.prototype.getX->true
            // f1.sum===f2.__proto__.sum->false
            // f1.sum===Fn.prototype.sum->false
            // f1.hasOwnProperty->f1.__proto__.__proto__.hasOwnProperty
            //在IE浏览器中,我们原型模式也是同样的原理,但是IE浏览器怕你通过__proto__把公有的修改,禁止我们使用__proto__;
            f1.sum = function () {
                //修改自己私有的sum
            };
            f1.__proto__.sum = function () {
                //修改所属类原型上的sum
            };
            Fn.prototype.sum = function () {
                //修改公有的sum
            };
        </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值