zoukankan      html  css  js  c++  java
  • 继承方法-->最终模式

            function inherit(Target,Origin){
                function F(){};
                F.prototype = Origin.prototype;  //
                Targrt.prototype = new F();
                Target.prototype.constructor = Target;  //增加自己的constructor
                Target.prototype._super = Origin;  //找到自己的超类
            }


    function F(){};    中间函数
    F.prototype = Origin.prototype;  
    Targrt.prototype = new F();
    或者

    function proto(target,obj){
            function Fn(){};
            Fn.prototype = obj.prototype;
            target.prototype = new Fn();
        }
        function proto2(target,obj){
            function Fn(){};
            Fn.prototype = obj.__proto__;
            target.__proto__ = new Fn();
        }
        function son(){
            this.name = 'tom';
        };
        function father(){
            this.name = 'jim';
        };
        father.prototype = {
            lastName:'Green'
        }
        //proto(son,father);
        var s1 = new son();
        var f1 = new father();
        proto2(s1,f1);
        console.log(s1.lastName);

    类似的方法:原型继承

    function Obj(o){
            function f(){};
            f.prototype = o;
            return new f();
        }
        
        function person(name,age){
            this.name = name;
            this.age = age;
        }
    
        person.prototype.say = function(){
            console.log(this.name+' : '+this.age);
        }
        var p1 = Obj(new person('zhangsan',23));
        var p2 = Obj(new person('zhangsan',23));
        console.log(p1);
        console.log(p2);
        console.log(p1.__proto__ === p2.__proto__);//false
        console.log(p1.__proto__.__proto__ === p2.__proto__.__proto__);//true
        p1.name1 = 'zhangsan';
        p2.name1 = 'lisi';
        p1.__proto__.name = 'liuliu';
        console.log(p1);
        console.log(p2);
        //so要把原型的constructor回归到原型
        p1.__proto__.constructor = person;
        p1.__proto__._superProto = person.prototype;
        console.log(p1.__proto__.constructor);
        console.log(p1.__proto__._superProto);

    闭包形式

            var inherit = (function(){
                var F = function(){}
                return function(Target,Origin){
                    F.prototype = Origin.prototype;
                    Target.prototype = new F();
                    Target.prototype.constructor = Target;
                    Target.prototype._super = Origin;
                    console.log(1);
                }
            }())
            function Father(){};
            Father.prototype.name = 'zhang';
            function Son(){};
            inherit(Son,Father);
            var father = new Father();
            var son = new Son();
            console.log(son.name);
    问题:
    var father = new Father(); var son = new Son();//son指向一个Son()对象 ,(son.__proto__ === Son.prototype)Son.prototype指向一个空间,
    inherit(Son,Father);//Son.prototype指向了另一个空间,但是son.__proto__指向的空间并没有变化,所以name属性找不到 
    console.log(son.name);//undefined

    实例:
            function Father(){};
            Father.prototype.lastName = 'Zhangsan';
            var F = new Father();
            function Son(){};
            Father.prototype = new Son();
            var P = new Father();
            console.log(F.lastName);//zhangsan
            console.log(P.lastName);//undefined
  • 相关阅读:
    23中设计模式详解
    C#中的partial,this关键字以及扩展方法
    笨重WebService与轻快的RestFul
    彻底理解Web Service
    WebService中的瘦客户端与富客户端
    [转]Sql Or NoSql,看完这一篇你就懂了
    [转]Mysql字符串截取总结:left()、right()、substring()、substring
    [转]ASP.NET Core on K8s 入门学习系列文章目录
    [转]CSDN-markdown语法之怎样使用LaTeX语法编写数学公式
    [转]我在传统行业做数字化转型(1)预告篇
  • 原文地址:https://www.cnblogs.com/jokes/p/9234779.html
Copyright © 2011-2022 走看看