首先我们先看一个构造函数
function Dad(){
this.name = '张三',
this.age = 16
}
Dad.prototype.like = function(){
console.log('高尔夫');
}
假如现在有一函数,想继承Dad的属性方法,可以以下做法
function Son(){
Dad.call(this);
}
Son.prototype = Dad.prototype;
但是以上做法存在的问题是,prototype即使属性,也是对象。像上面这做法 Son.prototype=Dad.prototype,指的都是同一个指针,修改了其中某个都会影响另一个。所以会采取以下做法
function Son(){
Dad.call(this);
}
let Link = function(){}
Link.prototype = Dad.prototype;
Son.prototype = new Link();
Son.prototype.constructor = Son;
这个Link的作用相当于切断了Son 和 Dad的联系。new Link()是重新实例化一个新的对象,然后Son.prototype = 新的对象,不存在和Dad指同个指针,即不会影响到双方。
然后在prototype中有个默认属性constructor,每一个对象实例都可以通过 constrcutor 对象访问它的构造函数,若不修改,那Son指向的都会是Link.
Son.prototype.constructor = Son;
完成代码如下
function Dad(){
this.name = '张三',
this.age = 16
}
Dad.prototype.like = function(){
console.log('高尔夫');
}
function Son(){
Dad.call(this);
}
let Link = function(){}
Link.prototype = Dad.prototype;
Son.prototype = new Link();
Son.prototype.constructor = Son;
Son.prototype.like = function(){
console.log('1111');
}
let drag = new Son();
drag.like();
如若有讲或不对,欢迎指正。