Js面向对象整理(二)

举报
rockyyee 发表于 2020/07/05 16:05:08 2020/07/05
【摘要】 本篇记录个人所学Js面向对象整理(二),知识点涉及原型继承、原型链。

Js面向对象整理(二)


构造函数继承

  • 继承:子类继承父类所有属性和行为,父类不受影响。

  • 目的:找到类之间的共性精简代码



原型继承:组合继承

function Cat() {
    this.leg = "4";
}
Cat.prototype.climb = function() {
    console.log("climb tree...");
}

function Tiger() {
    Cat.call(this);
}
function Link() {

}

Link.prototype = Cat.prototype;
Tiger.prototype = new Link();
Tiger.prototype.constructor = Tiger;
// Tiger.prototype = Cat.prototype;
Tiger.prototype.climb = function() {
    console.log("climb grassy...");
}

let tigger = new Tiger();
console.log(tigger);
tigger.climb();

let kitty = new Cat();
console.log(kitty);
kitty.climb();



原型继承:深拷贝继承

// 自封深拷贝函数
let deepCopy = obj => {
    let newObj = Array.isArray(obj) ? [] : {};
    for(let k in obj) {
        if(obj.hasOwnProperty(k)) {
            if(typeof obj[k] === "object") {
                if(obj[k] === null) {
                    newObj[k] = null;
                }else{
                    newObj[k] = deepCopy(obj[k]);
                }
            }else {
                newObj[k] = obj[k];
            }
        }
    }
    return newObj;
}


function Cat() {
    this.leg = "4";
}
Cat.prototype.climb = function() {
    console.log("climb tree...");
}

function Tiger() {
    Cat.call(this);
}
Tiger.prototype = deepCopy(Cat.prototype);
Tiger.prototype.climb = function() {
    console.log("climb grassy...");
}

let tigger = new Tiger();
console.log(tigger);
tigger.climb();

let kitty = new Cat();
console.log(kitty);
kitty.climb();



原型链


原型链是指对象在访问属性或方法时的查找方式。


1.当访问一个对象的属性或方法时,会先在对象自身上查找属性或方法是否存在,如果存在就使用对象自身的属性或方法。如果不存在就去创建对象的构造函数的原型对象中查找 ,依此类推,直到找到为止。如果到顶层对象中还找不到,则返回 undefined。


2.原型链最顶层为 Object 构造函数的 prototype 原型对象,给 Object.prototype 添加属性或方法可以被除  null 和 undefined 之外的所有数据类型对象使用。


case1:

function Person() {
    this.name = "rocky";
}
let guy = new Person();
console.log(guy.name);  //  rocky


case2:

function Person() {
    // this.name = "rocky";
}
Person.prototype.name = "sunny";

let guy = new Person();
console.log(guy.name);  //  sunny


case3:

function Person() {
    // this.name = "rocky";
}
// Person.prototype.name = "sunny";
Object.prototype.name = "carol";

let guy = new Person();
console.log(guy.name);  //  carol



END

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。