资讯专栏INFORMATION COLUMN

javascript的类与继承

impig33 / 2010人阅读

摘要:的类与继承的类与一般的面向对象语言有很大的不同,类的标识是它的构造函数,下面先定义一个类显然我们可以看出这两个函数是不同的,虽然它们实现了相同的功能。利用构造函数来继承上面的方法子类显然无法继承父类的原型函数,这样不符合我们使用继承的目的。

javascript的类与继承

javascript的类与一般的面向对象语言有很大的不同,类的标识是它的构造函数,下面先定义一个类

var User=function(name){
    this.name=name;
};
User.getName=function(){return this.name;};
User.prototype.get_name=function(){return this.name};
user1=new User("kkk");
user2=new User("jjj");
user1.getName=function(){console.log("hello");};
user1.get_name=function(){console.log("hello");};

显然我们可以看出这两个函数是不同的,虽然它们实现了相同的功能。
接下来我们先解释构造函数,当我们使用new操作符生成对象时,对象在进入函数之前就已经存在了,构造函数所完成的仅仅是初始化的工作。

每个javascript的函数都生而具有prototype这一属性,它们的new 与prototype.constructor有关。有以下关系存在:

User.prototype.constructor===User
true

同时类的静态方法如getName并不是一种值得推荐的方法,因为对于每一个被创建的对象都会创建相应的函数对象,方法在这里与其他的属性并无任何不一致之处。

通过工厂方法创建类

var User=function(name){
    var user;
    user.name=name;
    user.getName=function(name){return user.name;};
    return user;
}();

通过工厂方法可以直接创建继承了原型方法的对象,但是这样得到的问题在于没有prototype属性,需要手动添加,不推荐这种方法。

下面开始讲继承的方法,先给出一种示例

function Vip(name,level){
    this.name=name;
    this.level=level;
}
Vip.prototype=User;
alert(Vip.prototype.construtor===Vip);//false

这样显然不行,对子类的任何方法的改变都会导致父类的方法改变,更严重的是继承链遭到破坏。

利用构造函数来继承

function Vip(name,level){
    User.call(this,name);
    this.level=level
}
User.prototype.hehe=function(){console.log("hehe");};
(new Vip("kf",2)).hehe();//error!

上面的方法子类显然无法继承父类的原型函数,这样不符合我们使用继承的目的。

function Vip(name,level){
    this.name=name;
    this.level=level;
}
Vip.prototype=new User();
Vip.prototype.constructor=Vip;

这是一种折衷的继承方式,本质上把子类的所有对象绑定到父类的一个对象上,子类原型方法就是这个对象的一个属性。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85429.html

相关文章

  • JavaScript基础: 类与继承

    摘要:类的方法相当于之前我们定义在构造函数的原型上。的构造函数中调用其目的就是调用父类的构造函数。是先创建子类的实例,然后在子类实例的基础上创建父类的属性。 前言   首先欢迎大家关注我的Github博客,也算是对我的一点鼓励,毕竟写东西没法获得变现,能坚持下去也是靠的是自己的热情和大家的鼓励。    许久已经没有写东西了,因为杂七杂八的原因最近一直没有抽出时间来把写作坚持下来,感觉和跑步一...

    liuchengxu 评论0 收藏0
  • TS 类与接口

    摘要:二正文中与的区别接口只声明成员方法,不做实现。在中,我们可以采用全新的基于类继承的模式设计更优雅的语义化接口,这是因为中的可以继承动态构造的类,这一点和其他的静态声明类的编程语言不同。 一 前言 1.在typescript上遇到过实例化对象的两种写法:implement和extends。extends很明显就是ES6里面的类继承,那么implement又是做什么的呢?它和extends...

    garfileo 评论0 收藏0
  • Python方法(二) - 类与继承

    摘要:在类内部的方法中使用时。类的私有方法两个下划线开头,声明该方法为私有方法,不能在类地外部调用。先在本类中查找调用的方法,找不到才去基类中找。如果在继承元组中列了一个以上的类,那么它就被称作多重继承。 类定义 类对象:创建一个类之后,可以通过类名访问、改变其属性、方法 实例对象:类实例化后,可以使用其属性,可以动态的为实例对象添加属性(类似javascript)而不影响类对象。 类...

    DevWiki 评论0 收藏0
  • JS中类与类的继承

    摘要:首先捋清楚类和对象的关系类比如人类,指的是一个范围对象比如某个人,指的是这个范围中具体的对象中的作为构造函数时,就是一个类,通过操作符,可以返回一个对象。 JS中的类与类的继承 我们知道,JS中没有类或接口的概念,即不能直接定义抽象的类,也不能直接实现继承。不过,为了编程的方便,我们可以在 JS 中模拟类和继承的行为。首先捋清楚类和对象的关系: 类:比如人类,指的是一个范围; ...

    Tangpj 评论0 收藏0
  • java学习(三) —— 面对对象

    摘要:前言是面对对象的语言,因此有必要单独纪录下对象的各种定义和理解。面对对象基本概述概述是基于面向过程的变成思想,是对面向过程的一种封装。面对对象开发就是不断的创建对象,使用对象,指挥对象做事情。面对对象设计其实就是在管理和维护对象之间的关系。 前言 java是面对对象的语言,因此有必要单独纪录下对象的各种定义和理解。 面对对象,主要包括:面向对象思想,类与对象及其使用,对象的内存图,成...

    褰辩话 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<