js继承遇到的小问题

这两天在看js继承方面,它不像OC那种传统的类继承。js继承方式还是挺多的。比如:原型继承、原型冒充、复制继承

原型继承

原型继承有点绕,js似乎没有类的概念,构造对象都是用的函数调用来实例化一个对象。函数都有一个prototype属性,如果要继承可以用函数的prototype属性来赋值父类的一个实例,这样就拥有父类的属性和方法

<script>
     function Cat ()  {
            this.climb = function () {
            alert("爬树");
        }
    }
     function Tiger()  {
            this.eat = function () {
            alert("吃肉");
        }
    }
    function Animal() {
            this.breath = function () {
                alert("呼吸");
            }
    }
    Tiger.prototype = new Cat();
    var tiger = new Tiger();
    tiger.eat();
    tiger.climb();

     console.log(tiger.__proto__);
     console.log(tiger.__proto__.__proto__);
     console.log(tiger.__proto__.__proto__.__proto__);
     console.log(tiger.__proto__.__proto__.__proto__.__proto__);

     var ani = new Animal();
    console.log(ani.__proto__);

    Tiger.prototype = ani;

    tiger = new Tiger();
    tiger.breath();
     tiger.eat();

     function All() {
         this.say = function () {
             alert("say");

         }
     }

    Animal.prototype = new All();
        ani = new Animal();
        ani.say();

</script>

原型冒充

注意call的用法

<script>

    function Good() {
        this.goodStudy = function () {
            console.log("好好学习");
            console.log(this);
        }
    }
    function Bad() {

    Good.call(this);
        this.badPlay = function () {
            console.log("就会玩");
        }
    }
    var bad = new Bad();
    bad.badPlay();
    bad.goodStudy();

</script>

复制继承

<script>

    function Good() {
        this.iq = 120;
        this.goodStudy = function () {
            console.log("好好学习");
        }
    }

    function Bad(obj) {
        this.badPlay = function () {
            console.log("就会玩");
        }
        this.extend = function (obj) {
            for (var k in obj){
                this[k] = obj[k];
            }
        }
    }

    var good = new Good();
    var bad = new Bad();
    bad.extend(good);

    bad.goodStudy();
    console.log(bad.iq);

</script>

这里面遇到一个问题,在循环遍历extend函数的时候,访问对象属性用的“[ ]”,如果用“.”会报错,其实js对象属性有两种访问形式:“.”和“[ ]",两个有区别,性能方面“.”更高一些。
Obj.key 和 Obj[key] 我的通俗理解: 1、当对象的属性key不确定而是一个变量的时候必须使用[] 2、[]里可以是任意字符串,而. 不能随便 3、使用. 号key可不加引号, 使用[] key有时候需要加引号。

嗯,就写到这里

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,404评论 2 17
  • 博客内容:什么是面向对象为什么要面向对象面向对象编程的特性和原则理解对象属性创建对象继承 什么是面向对象 面向对象...
    _Dot912阅读 5,305评论 3 12
  • 前端开发必须知道的JS(一) 原型和继承 原型和闭包是Js语言的难点,此文主要讲原型及原型实现的继承,在(二)中会...
    JamHsiao_aaa4阅读 1,238评论 0 0
  • 中午,我和妈妈送哥哥上作文课的啦。回来时,我妈妈她还上超市给我买了许多好吃的,我妈妈还给我买了个玩具,还给我买了三...
    邸广硕阅读 1,306评论 0 1
  • 昨晚林泽伟买了两张票,《会痛的十七岁》,结果他晚上要陪领导,让我带老雷去看。晚饭是我做的,抄了两个菜,一个是酸菜肉...
    黄雨田阅读 2,790评论 0 0

友情链接更多精彩内容