JS 继承的几种方法总结
由于 js 不像 java 那样是真正面向对象的语言,js 是基于对象的,它没有类的概念
所以,要想实现继承,可以用 js 的原型 prototype 机制或者用 apply 和 call 方法去实现。在面向对象的语言中,我们使用类来创建一个自定义对象。然而 js 中所有事物都是对象,那么用什么办法来创建自定义对象呢?
这就需要用到 js 的原型:我们可以简单的把 prototype 看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,新实例化的对象内部有一个看不见的 Proto 指针,指向原型对象)。
1、对象冒充
blogfunction Parent(username){
this.username = username;
this.hello = function(){
console.log('hello ' + this.username);
}
}
Parent.prototype.sayMorning = function(){
console.log('good morning ' + this.username);
}
function Child(username,password){
//通过以下 3 行实现将 Parent 的属性和方法追加到 Child 中,从而实现继承
//第一步:this.method 是作为一个临时的属性,并且指向 Parent 所指向的对象,
//第二步:执行 this.method 方法,即执行 Parent 所指向的对象函数
//第三步:销毁 this.method 属性,即此时 Child 就已经拥有了 Parent 的所有属性和方法
this.method = Parent;
this.method(username);//最关键的一行
delete this.method;
this.password = password;
this.world = function(){
console.log(this.password);
}
}
var parent = new Parent("zhangsan");
var child = new Child("lisi","123456");
parent.hello();
parent.sayMorning();
child.hello();
child.world();
2、call() 方法方式
function Parent(username){
this.username = username;
this.hello = function(){
console.log(this.username);
}
}
Parent.prototype.sayMorning = function(){
console.log('good morning ' + this.username);
}
function Child(username,password){
Parent.call(this,username);
this.password = password;
this.world = function(){
console.log(this.password);
}
}
var parent = new Parent("zhangsan");
var child = new Child("lisi","123456");
parent.hello();
parent.sayMorning();
child.hello();
child.world();
// child.sayMorning(); 通过 prototype 添加的方法和属性,不能用来继承
3、apply() 方法方式
function Parent(username){
this.username = username;
this.hello = function(){
console.log(this.username);
}
}
Parent.prototype.sayMorning = function(){
console.log('good morning ' + this.username);
}
function Child(username,password){
Parent.apply(this,new Array(username));
this.password = password;
this.world = function(){
console.log(this.password);
}
}
var parent = new Parent("zhangsan");
var child = new Child("lisi","123456");
parent.hello();
parent.sayMorning();
child.hello();
child.world();
// child.sayMorning(); 通过 prototype 添加的方法和属性,不能用来继承
4、原型链方式
即子类通过 prototype 将所有在父类中通过 prototype 追加的属性和方法都追加到 Child,从而实现了继承
function Person(){
}
Person.prototype.hello = "hello";
Person.prototype.sayHello = function(){
console.log(this.hello);
}
function Child(){
}
Child.prototype = new Person();//这行的作用是:将 Parent 中将所有通过 prototype 追加的属性和方法都追加到 Child,从而实现了继承
Child.prototype.world = "world";
Child.prototype.sayWorld = function(){
console.log(this.world);
}
var c = new Child();
c.sayHello();
c.sayWorld();
通过 prototype 添加的方法和属性,不能用来继承
5、混合方式
混合了 call 或者 apply 方式、原型链方式
function Parent(hello){
this.hello = hello;
}
Parent.prototype.sayHello = function(){
console.log(this.hello);
}
function Child(hello,world){
Parent.call(this,hello);//将父类的属性继承过来
this.world = world;//新增一些属性
}
Child.prototype = new Parent();//将父类的方法继承过来
Child.prototype.sayWorld = function(){//新增一些方法
console.log(this.world);
}
var c = new Child("zhangsan","lisi");
c.sayHello();
c.sayWorld();
可以继承通过 prototype 添加的方法和属性
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: JS 中的事件绑定、事件监听、事件委托
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论