js函数(类)的继承机制的设计与实现(五)

  • 最近我一直在思考如何完善本文提出的js继承实现机制。我们知道,面向对象的好处之一是其封装性,能够保护对象内部的数据与结构。但是,在之前本文给出的js继承实现机制模板中,obj_this.assign(this_obj)函数的存在破坏了封装性。设计之初,我是希望assign(this_obj)作为一个私有函数存在,但由于js特性和功能的需要,必须将它设计为this指针的属性,因此,破坏了函数的封装性。如果在使用的过程中,如果不小心调用了该函数,并赋予新的值,则将会破会对象原有功能,因此,obj_this.assign(this_obj)使得申明的对象存在一定的风险。

  • 我希望能够从js继承机制模板中去掉obj_this.assign(this_obj)。经过不断思考和实验,我对js中的this指针有了更加深入的了解,即函数的this指针与函数new出来的对象的指针指向同一个对象。什么意思呢?我们看看下面这个测试代码就明白了。测试代码如下:

           function test(){
                var a = new AA();
                a.run();
                a.new_value = 456;
                a.run();
            }

            function AA(){
                this.value = 123;
                this.run = function(){
                    console.log(this.value);
                    console.log(this.new_value);
                };
            }
  • 测试结果如下:

这里写图片描述

  • 在第一调用a.run()函数时,由于在AA中只申明了this.value = 123,而没有申明new_value属性,因此this.new_value值为undefined。在第二次调用a.run()时,之前通过a.new_value = 456的方式为对象a添加了属性new_value,而这个属性是可以被run()函数中的this调用的。即得出结论:函数AA()的this指针与new出来的对象指针a是指向同一个对象。

  • 因此,在之前提出的js继承实现机制模板中,我们设定了obj_this = this的初始化,即reset方法是完全可以去掉了。(ps:在第一篇中之所以提出obj_this.assign方法有以下两个原因:1,那时候还没有给obj_this赋值为this,而是赋值为null;2,并不知道js的this指针的真实含义。)

  • 修正后的js继承实现机制的模板如下:

//js函数继承机制实现的模板规范。

            //没有继承任何函数的函数规范定义
            function parent_function(){
                var obj_this = this;
                obj_this.instantiate(){
                    obj_this = new parent_function();
                    return obj_this;
                };
                /...
                your code are written here
                用obj_this完全代替this指针
                .../
                return obj_this;
            }

            //继承了父函数的子函数的函数规范定义
            function your_function(){
                var obj_this = this;//很重要
                obj_this.instantiate = function(){
                    your_function.prototype = parent_function().instantiate();//继承父函数
                    your_function.prototype.construct = your_function;
                    obj_this = new your_function();
                    obj_this.obj_parent = your_function.prototype;//通过obj_parent属性指向父函数实体
                    return obj_this;
                };
                /...
                your code are written here
                用obj_this完全代替this指针,并可通过obj_this.来访问父函数和本函数的所有公有属性和方法。
                当子函数重写父函数方法时,可以通过obj_this.obj_parent.访问被重写的父函数的方法
                .../

                return obj_this;
            }
  • 与之前的模板项目,去掉了obj_this.assign函数,使得封装性更好,程序更加健壮,代码更加简洁。

猜你喜欢

转载自blog.csdn.net/u012409928/article/details/51684807