zoukankan      html  css  js  c++  java
  • Javascript:图形解释如何实现“ 单继承 、多继承 、掺入 “

    Javascript:图形解释如何实现“ 单继承 、多继承 、掺入 “

     

    前提知识

    Javascript:必须知道的Javascript知识点之“原型链”

    Javascript:必须知道的Javascript知识点之“this指针”

    Javascript:用 "脑图软件" 学习 “面向对象”

    几个内置核心方法学习

    代码示例

    复制代码
     1 var Base = function (name) {
     2     this.name = name;
     3 };
     4 
     5 var base = new Base();
     6 
     7 console.log((base instanceof Object));//true
     8 console.log((base instanceof Base));//true
     9 console.log(Base.prototype.isPrototypeOf(base));//true
    10 console.log(Object.prototype.isPrototypeOf(base));//true
    11 console.log(base.hasOwnProperty("name"));//true
    12 console.log(base.hasOwnProperty("toString"));//false
    13 console.log(("name" in base));//true
    14 console.log(("toString" in base));//true
    复制代码

    图形示意

    instanceof

    obj instanceof T,判断obj.__proto__指向的原型链是否包含T.prototype。

    isPrototypeOf

    objLeft.isPrototypeOf(objRight),判断objLeft是否包含在objRight.__proto__指向的原型链中。

    hasOwnProperty

    obj.hasOwnProperty(propertyName),判断obj(不包括原型链)是否包含属性“propertyName”。

    in

    propertyName in obj,判断属性“propertyName”是否包含在对象obj及其原型链中。

    单继承实现

    在javascript中实现单继承的思路是:让ChildType.prototype.__proto__指向ParentType.prototype。

    代码示例

    复制代码
     1 Function.prototype.extend = function (baseType) {
     2     var tempType = function () { };
     3     tempType.prototype = baseType.prototype;
     4 
     5     this.prototype = new tempType();
     6     this.prototype.constructor = this;
     7     this.super = function () {
     8         return baseType.prototype;
     9     };
    10 };
    11 
    12 var Base = function (name) {
    13     this.name = name;
    14 };
    15 
    16 var Animal = function () {
    17     Animal.super().constructor.apply(this, arguments);
    18 };
    19 Animal.extend(Base);
    20 
    21 var Dog = function () {
    22     Dog.super().constructor.apply(this, arguments);
    23 };
    24 Dog.extend(Animal);
    25 
    26 var dog = new Dog('笨狗');
    27 console.log(dog.name);//笨狗
    28 console.log(dog instanceof Base);//true
    29 console.log(dog instanceof Animal);//true
    30 console.log(dog instanceof Dog);//true
    复制代码

    图形示意

    常见问题

    问题:为什么要引入“tempType”,而不是直接“this.prototype = new baseType()”?

    答案:“new baseType()”会导致构造方法被调用两次。

    问题:为什么不直接“this.prototype = baseType.prototype”?

    答案:这样的话,父子类型就会同时指向一个prototype,不符合继承的语义。

    掺入实现

    参考文章:设计原则:请重新审视“多重继承”,找机会拥抱一下“掺入(Mixin)”

    在javascript中实现掺入的思路是:拷贝MixinType.prototye包含的所有属性到TargetType.prototype中。

    代码示例

    复制代码
     1 Function.prototype.extend = function (baseType) {
     2     var tempType = function () { };
     3     tempType.prototype = baseType.prototype;
     4 
     5     this.prototype = new tempType();
     6     this.prototype.constructor = this;
     7     this.super = function () {
     8         return baseType.prototype;
     9     };
    10 };
    11 
    12 var Base = function (name) {
    13     this.name = name;
    14 };
    15 
    16 var Animal = function () {
    17     Animal.super().constructor.apply(this, arguments);
    18 };
    19 Animal.extend(Base);
    20 
    21 var Dog = function () {
    22     Dog.super().constructor.apply(this, arguments);
    23 };
    24 Dog.extend(Animal);
    25 
    26 var dog = new Dog('笨狗');
    27 console.log(dog.name);//笨狗
    28 console.log(dog instanceof Base);//true
    29 console.log(dog instanceof Animal);//true
    30 console.log(dog instanceof Dog);//true
    31 
    32 Function.prototype.mixin = function (name, mixinType) {
    33     this.mixins = {};
    34     this.mixins[name] = mixinType;
    35 
    36     for (var property in mixinType.prototype) {
    37         if (property in this.prototype) {
    38             continue;
    39         }
    40 
    41         this.prototype[property] = mixinType.prototype[property];
    42     }
    43 };
    44 
    45 var Pet = function () {
    46 };
    47 Pet.prototype.aoao = function () {
    48     console.log(this.name + ',嗷嗷!');
    49 };
    50 
    51 Dog.mixin('pet', Pet);
    52 dog.aoao();
    53 console.log(dog instanceof Pet);//false
    复制代码

    图片示意

    常见问题

    问题:这种掺入实现是不是太简单了?

    答案:确实,但是能满足80%的需求,掺入的主要目的就是代码复用。

    备注

    由于“原型链”的限制,Javascript实现不了真正意义的“多重继承”。

  • 相关阅读:
    Linux下三个密码生成工具
    禁止root用户远程登录
    servlet/filter/listener/interceptor区别与联系
    linux top命令查看内存及多核CPU的使用讲述
    Django-MTV
    Python开发【前端】:jquery
    Python开发【前端】:JavaScript
    查看所有用户下的定时任务
    linux下如何查看哪些进程占用的CPU内存资源最多
    CentOS7 使用tab建补全命令
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3053066.html
Copyright © 2011-2022 走看看