js原型链

 

 

 

 

  function People(name){
            this.name=name;
        }

        People.prototype.showName=function(){  prototype原型
            console.log(this.name);
        }

        function Student(){  函数不可以直接调用 和别的相等

        }

        Student.prototype=new People("张三")   study给了People 

        Student.prototype.study=function(){ 
            console.log("学习");
        }

        var stu=new Student();  Student.prototype===stu.__proto__

        stu.study();
        stu.showName();


        console.dir(stu.__proto__===Student.prototype)
        console.dir(Student.prototype.__proto__===People.prototype)
        console.dir(stu.__proto__.__proto__===People.prototype)

        console.dir(Student.prototype.__proto__.__proto__)  输出null 原型链的终止

        console.dir(stu.__proto__.__proto__.__proto__)
        1:Student.prototype
        2: People.prototype
        3:Object.prototype  原型链的最终指向Object
        4:null  Object的原型是null

        __proto__ 对象的原型
        prototype 构造函数的原型

 

Rect.prototype = new Shape();
优点:
1) 正确设置原型链实现继承
2) 父类实例属性得到继承,原型链查找效率提高,也能为一些属性提供合理的默认值
缺点:
1) 父类实例属性为引用类型时,不恰当地修改会导致所有子类被修改
2) 创建父类实例作为子类原型时,可能无法确定构造函数需要的合理参数,这样提供的参数继承
给子类没有实际意义,当子类需要这些参数时应该在构造函数中进行初始化和设置
Rect.prototype = Shape.prototype;
1) 优点:正确设置原型链实现继承
2) 缺点:父类构造函数原型与子类相同。修改子类原型添加方法会修改父类
 
Rect.prototype = Object.create(Shape.prototype);
Rect.prototype.area = function () {
// do something
};
1) 优点:正确设置原型链且避免方法 1.2 中的缺点
2) 缺点:ES5 方法需要注意兼容性
posted @ 2021-11-17 18:26  熊熊日记  阅读(27)  评论(0)    收藏  举报