原型继承

function Student(name) {
        this.name = name;
        this.hello = function () {
            alert('Hello, ' + this.name + '!');
        }
    }
   // PrimaryStudent构造函数:
    function PrimaryStudent(props) {
        Student.call(this, props);
        this.grade = props.grade || 1;
    }

    // 空函数F:
    function F() {
    }

    // 把F的原型指向Student.prototype:
    // “构造函数F”和“构造函数Student”的prototype指向一个原型对象
    F.prototype = Student.prototype;

    把PrimaryStudent的原型指向一个F构造函数实例化的对象:
    由于构造函数F的prototype指向了Stduent.prototype【构造函数Student的prototype属性】所以由“构造函数F”构造的所有实例共享“构造函数Student”的原型属性
PrimaryStudent.prototype = new F();
    构造函数PrimaryStudent的原型现在是构造函数F()的一个实例,共享F()构造函数的原型对象,而F构造函数的原型与Student共享一个原型,所以构造函数PrimaryStudent构造的实例可以访问Student的原型的所有属性,构成了原型继承

    // 把PrimaryStudent原型的构造函数修复为PrimaryStudent:
    console.log(PrimaryStudent.prototype.constructor)//原本指向Student
    PrimaryStudent.prototype.constructor = PrimaryStudent;
    console.log(PrimaryStudent.prototype.constructor)

    // 继续在PrimaryStudent原型(就是new F()对象)上定义方法:
    PrimaryStudent.prototype.getGrade = function () {
        return this.grade;
    };

    // 创建xiaoming:
    //构造一个实例xiaoming,xiaoming共享“构造函数PrimaryStudent”的原型F()
    /*【PrimaryStudent.prototype = new F();】∵xiaoming是构造函数PrimaryStudent构造出来 PrimaryStudent.prototype是一个对象包含“构造函数PrimaryStudent”构造的所有实例共享的属性 和方法。 而PrimaryStudent.prototype是一个对象,这个对象由“构造函数 F()”构造,所以这个对象共享构造函数 的prototype属性,而构造函数F()的prototype和Student的prototype一样。*/
    var xiaoming = new PrimaryStudent({
        name: '小明',
        grade: 2
    });
   /
    xiaoming.name; // '小明'
    console.log(xiaoming.name)
    xiaoming.grade; // 2
    console.log(xiaoming.grade)

    // 验证原型:
    xiaoming.__proto__ === PrimaryStudent.prototype; // true
    console.log(xiaoming.__proto__ === PrimaryStudent.prototype)
    xiaoming.__proto__.__proto__ === Student.prototype; // true
    console.log(xiaoming.__proto__.__proto__ === Student.prototype)

    // 验证继承关系:
    xiaoming instanceof PrimaryStudent; // true
    console.log(xiaoming instanceof PrimaryStudent)
    xiaoming instanceof Student; // true
    console.log(xiaoming instanceof Student)
全部评论

相关推荐

08-28 11:37
已编辑
华东师范大学 Java
Sigma777:本来想说师弟怎么把我这个老东西卷没了,仔细一看是师兄 简历不错,但是得准备好选型话术,比如我举个例子你为什么要用caffeine,一般我们的小项目不会有这么hot的key需要本地缓存,你要说明你是如何发现有这么hot的key连redis都兜不住的,引入后优化了多少时间,然后还有本地缓存大小设置为多少,这个大小能保证热点key不会因为太小而淘汰也不会因为太大影响服务吗,为什么不用guava,引入本地缓存同步问题怎么解决。 然后分库分表,为什么你觉得要分表,数据量多少,分多少张表几个库,分片键选择依据,你的所有查询能不能准确定位到某一张避免全库扫描,有没有数据倾斜问题就是分的每张表数据量差距特别大,你是一开始分库分表还是后期发现瓶颈才分,如果后期才分你如何把旧表的数据搬过去同时还能确保业务正常运行。 然后是消息队列,你说缓存高并发请求,却选择了吞吐量较小的rabbit,有什么原因吗,为什么不选Kafka。 然后你说分布式锁解决集群环境并发安全,也就是说你是集群部署的,请问是怎么部署的,docker还是k8s,部署几台,配置是多少,jvm参数设置是多少,有监控吗,线上遇到故障吗,怎么解决的,有做负载均衡吗,数据是怎么压测的等等。 zset缓存本月实时排行数据具体怎么做的,会有大key问题吗。 其他本小渣暂时想不到了,留给其他大神点评
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务