Js面向对象整理(二)
        【摘要】  本篇记录个人所学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)