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 方法需要注意兼容性

浙公网安备 33010602011771号