原型链、继承

  • prototype 与 _proto_
//实现一个instanceof

function instance_of(L,R){
    L = L.__proto__;
    while(L !== null){
        
        if(L === R.prototype) return true;
        L = L.__proto__;
    }
    return false;
}
    

参考文章:原型链—Object\Function _proto_ 的关系

参考文章:JavaScript 世界万物诞生记

JavaScriptååå³ç³»å¾

  • new的实现

重点是两步:

1、实例的__proto__指向构造函数的prototype

2、构造函数中的this指向实例。

//var p = mockNew(Person,"olivia",18);

function Person(name, age) {
  this.name = name;
  this.age = age;
}

function mockNew(){
    //1、创建一个对象
    let obj = {};

    //arguments 是类数组,不是真正的数组,所以不能直接调用shif方法。也可用Array.from转换为数组,详见mockNew2
    //获取construtor,即构造函数Person
    let _constructor = [].shift.call(arguments);

    //2、将对象的_proto_ 指向构造函数的原型对象
    obj.__proto__ = _constructor.prototype;

    //3、将构造函数(Person)中的this 指向obj
    _constructor.apply(obj,arguments);
 
    //4、返回这个函数
    return obj;
}

function mockNew2(){
    //1、创建一个对象
    let obj = {};

    //arguments 是类数组,不是真正的数组,使用用Array.from转换为数组
    //获取construtor,即构造函数Person
    let arr = [];
    arr = Array.from(arguments);
    let _constructor = arr.shift();

    //2、将对象的_proto_ 指向构造函数的原型对象
    obj.__proto__ = _constructor.prototype;

    //3、将构造函数(Person)中的this 指向obj
    _constructor.apply(obj,arr);
 
    //4、返回这个函数
    return obj;
}


JS 的 new 到底是干什么的? 

如何实现 JavaScript 的 new 运算符

30分钟学会继承

//自己实现的组合寄生继承
//重点在两句:
//1、在子构造函数中使用apply,调用父构造函数
//2、子构造函数的prototype = Object.create(父构造函数的prototype)
//最后记得将子类的constructor指回来

function Parent(name){
	this.name = "name";
}
Parent.prototype.callName = function(){
	console.log(this.name)
}
function Child(name){
    //*****重点1*****
	Parent.apply(this,arguments);

	this.name = name;
}
//*****重点2*****
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
//别人的实现
//作者:寻找海蓝96
//链接:https://juejin.im/post/5d51e16d6fb9a06ae17d6bbc


function Parent(name) {
    this.parent = name
}
Parent.prototype.say = function() {
    console.log(`${this.parent}: 你打篮球的样子像kunkun`)
}
function Child(name, parent) {
    // 将父类的构造函数绑定在子类上
    Parent.call(this, parent)
    this.child = name
}

/** 
 1. 这一步不用Child.prototype =Parent.prototype的原因是怕共享内存,修改父类原型对象就会影响子类
 2. 不用Child.prototype = new Parent()的原因是会调用2次父类的构造方法(另一次是call),会存在一份多余的父类实例属性
3. Object.create是创建了父类原型的副本,与父类原型完全隔离
*/
Child.prototype = Object.create(Parent.prototype);
Child.prototype.say = function() {
    console.log(`${this.parent}好,我是练习时长两年半的${this.child}`);
}

// 注意记得把子类的构造指向子类本身
Child.prototype.constructor = Child;

var parent = new Parent('father');
parent.say() // father: 你打篮球的样子像kunkun

var child = new Child('cxk', 'father');
child.say() // father好,我是练习时长两年半的cxk

参考文章:22 道高频 JavaScript 手写面试题及答案

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值