zoukankan      html  css  js  c++  java
  • 对象冒充继承

     对象冒充:

    构造原始的ECMAScipt时,根本没打算设计对象冒充(object masquerading)。它是在开发者开始理解函数的工作方式,尤其是如何在函数环境中使用this关键字后才发展出来。

    其原理如下:构造函数使用this关键字给所有属性和方法赋值(即采用类声明的构造方式)。因为构造函数只是一个函数,所以可使ClassA构造函数成为ClassB的方法,然后调用它。ClassB就会收到ClassA的构造函数中定义的属性和方法。

    function ClassA(sColor) {
        this.color = sColor;
        this.sayColor = function () {
            alert(this.color);
        };
    }
    
    function ClassB(sColor) {
        this.newMethod = ClassA;
        this.newMethod(sColor);
        delete this.newMethod;
    }
    
    var objA = new ClassA("blue");
    var objB = new ClassB("red");
    objA.sayColor();    //输出 "blue"
    objB.sayColor();    //输出 "red"

    这种方式实现的本质是通过将子类的原型指向了父类的实例,所以子类的实例就可以通过_proto_访问自己的原型,即访问到父类的实例,进而访问到父类的原型,获得父类原型上的方法。

    call() 方法是与经典的对象冒充方法最相似的方法。它的第一个参数用作 this 的对象。其他参数都直接传递给函数自身。

    function sayColor(sPrefix,sSuffix) {
        console.log(sPrefix + this.color + sSuffix);
    };
    
    var obj = new Object();
    obj.color = "blue";
    
    sayColor.call(obj, "The color is ", "a very nice color indeed.");

    在这个例子中,函数 sayColor() 在对象外定义,即使它不属于任何对象,也可以引用关键字 this。对象 obj 的 color 属性等于 blue。调用 call() 方法时,第一个参数是 obj,说明应该赋予 sayColor() 函数中的 this 关键字值是 obj。第二个和第三个参数是字符串。它们与 sayColor() 函数中的参数 sPrefix 和 sSuffix 匹配,最后生成的消息 "The color is blue, a very nice color indeed." 将被显示出来。

    与继承机制的对象冒充方法一起使用该方法,只需将前三行的赋值、调用和删除代码替换即可:

    function ClassB(sColor, sName) {
        //this.newMethod = ClassA;
        //this.newMethod(color);
        //delete this.newMethod;
        ClassA.call(this, sColor);
    
        this.name = sName;
        this.sayName = function () {
            alert(this.name);
        };
    }

    apply() 方法有两个参数,用作 this 的对象和要传递给函数的参数的数组,

    未完,待续......
  • 相关阅读:
    el-select下拉框选项太多导致卡顿,使用下拉框分页来解决
    vue+elementui前端添加数字千位分割
    Failed to check/redeclare auto-delete queue(s)
    周末啦,做几道面试题放松放松吧!
    idea快捷键
    解决flink运行过程中报错Could not allocate enough slots within timeout of 300000 ms to run the job. Please make sure that the cluster has enough resources.
    用.net平台实现websocket server
    MQTT实战3
    Oracle 查看当前用户下库里所有的表、存储过程、触发器、视图
    idea从svn拉取项目不识别svn
  • 原文地址:https://www.cnblogs.com/zhishiyv/p/14628807.html
Copyright © 2011-2022 走看看