ES5里类的创建和继承

栏目: Java · 发布时间: 5年前

内容简介:JS里类就是方法,创建一个类其实就是定义一个方法,比如:这就定义了一个类里当然也可以定义方法了,js里类本身就是方法,定义类的方法,就是在这个方法里写匿名方法

JS里类的创建

JS里类就是方法,创建一个类其实就是定义一个方法,比如:

function Person() {
    this.name = 'tomcat';
    this.age = 20;
}

这就定义了一个 Person 类,要使用的话,需要 new 一个实例,如下

var p = new Person();
console.log(p.name);
console.log(p.age);

类里当然也可以定义方法了,js里类本身就是方法,定义类的方法,就是在这个方法里写匿名方法

function Person() {
    this.name = 'tomcat';
    this.age = 20;
    this.run = function() {
        console.log(`${name} is running...`);
    }
}

也可以通过原型链 prototype 来定义方法

// 原型链方式定义属性
Person.prototype.sex = 'male';
// 原型链方式定义方法
Person.prototype.work = function() {
    console.log(`${this.name} is working...`);
}

这样定义的方法是个实例方法,调用要使用类的实例来调用,如下

var p = new Person();
p.run();
p.work();

通过构造方法定义方法和原型链定义方法区别:原型链方式定义的方法可以被多个实例共享

上面说了在类里定义方法,这种方法是实例方法,如何定义静态方法呢?

Person.getInfo = function() {
    console.log('i am an static method!!');
}

// 调用直接使用类名调用
Person.getInfo();

测试结果是,静态方法里没法用 this.name 来获取构造方法里的属性

JS里类的继承

JS里类的继承有两种, 原型链 对象冒充 两种方式,而且这两种方式可以组合使用

冒充实现

定义一个类 People 类,让它继承 Person

function People() {
    Person.call(this);
}
// 调用
var people = new People();
people.run(); // 正常运行
people.work(); // 报错

对象冒充方式继承类,只能继承构造方法里定义的属性和方法,原型链定义的属性和方法是没法继承过来的

原型链继承

还是定义一个 People 类,通过原型链继承

function People() {

}

People.prototype = new Person();

// 调用
var people = new People();
people.run();
people.work();

原型链继承可以继承构造方法里的属性和方法也可以继承原型链里的属性和方法

但是原型链继承也是有问题的,看下面例子

如果 Person 对象里的属性是通过参数来实例化的

function Person(name, age) {
    this.name = name;
    this.age = age;
    this.run = function() {
        console.log(`name: ${this.name}, age: ${this.age}`);
    }
}
// 下面通过原型链继承
function People(name, age) {

}
People.prototype = new Person();
var people = new People('jetty', 22);
people.run(); // name: undefined, age: undefined

可以看到实例化子类的时候没法给父类传参

原型链+对象冒充

还是上面那个例子

function Person(name, age) {
    this.name = name;
    this.age = age;
    this.run = function() {
        console.log(`name: ${this.name}, age: ${this.age}`);
    }
}
Person.prototype.work = function() {
    console.log(`${this.name} is working...`);
}
// 下面通过原型链继承
function People(name, age) {
    Person.call(this, name, age);
}
People.prototype = new Person();
var people = new People('jetty', 22);
people.run(); // name: jetty, age: 22
people.work();

只需要在创建子类的构造方法里通过对象冒充的方式继承父类,并把参数传进去就可以了,下面打印就有子类传递的参数了

上面那种方法中原型链的继承用的是通过 new Person() 的方式来实现的,但上面子类里已经通过对象冒充的方式把父类的构造方法和属性都继承了,下面继承原型链属性方法就有些重复了,所以也可以写成下面这样

function Person(name, age) {
    this.name = name;
    this.age = age;
    this.run = function() {
        console.log(`name: ${this.name}, age: ${this.age}`);
    }
}
Person.prototype.work = function() {
    console.log(`${this.name} is working...`);
}
// 下面通过原型链继承
function People(name, age) {
    Person.call(this, name, age);
}
People.prototype = Person.prototype; // 这里只继承父类的原型链属性和方法,构造方法里的属性和方法就不继承了
var people = new People('jetty', 22);
people.run(); // name: jetty, age: 22
people.work();

参考

  • https://www.bilibili.com/video/av38379328?p=5

原文链接:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

啊哈!算法

啊哈!算法

啊哈磊 / 人民邮电出版社 / 2014-6-1 / 45.00元

这不过是一本有趣的算法书而已。和别的算法书比较,如果硬要说它有什么特点的话,那就是你能看懂它。 这是一本充满智慧和趣味的算法入门书。没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点, 通过幽默的语言配以可爱的插图来讲解算法。你更像是在阅读一个个轻松的小故事或是在玩一把趣味解谜 游戏,在轻松愉悦中便掌握算法精髓,感受算法之美。 本书中涉及到的数据结构有栈、队列、链表、树......一起来看看 《啊哈!算法》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具