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 的对象和要传递给函数的参数的数组,

    未完,待续......
  • 相关阅读:
    AlphaGo的前世今生(三)AlphaGo Zero: AI Revolution and Beyond
    AlphaGo的前世今生(二)AlphaGo: Countdown to AI Revolution
    AlphaGo的前世今生(一)Deep Q Network and Game Search Tree:Road to AI Revolution
    Exception starting filter [Tongweb WebSocket (JSR356) Filter
    spring boot 集成 redis 出现 “Unable to connect to localhost:6379”
    对女性友好的编程语言
    Git(1)
    js里面看一个字符串的汉字的个数
    celery使用的一些小坑和技巧(非从无到有的过程)
    永远相信美好的事情即将发生。
  • 原文地址:https://www.cnblogs.com/zhishiyv/p/14628807.html
Copyright © 2011-2022 走看看