JavaScript继承

继承有什么作用?

继承可以让子类拥有父类的方法和属性,然后在这个基础上进行方法和属性调用,可以提高代码的复用性和效率。

1. 下面两种写法有什么区别?

//方法1
function People(name, sex) {
    this.name = name;
    this.sex = sex;
    this.printName = function () {
        console.log(this.name);
    }
}

var p1 = new People('java', '男');

//方法2
function Person(name,sex) {
    this.name = name;
    this.sex = sex;
}

Person.prototype.printName = function () {
    console.log(this.name);
}
var p2 = new Person('javascript','女');
  • 写法1 把printName方法放在了构造函数里,每次new一个对象的时候,都会实例化当前对象的printName方法。如果当前new10个People对象,都会重复实例化当前printName方法10次,这样重复非常浪费空间。

  • 写法2 在每次new一个对象的时候,都不会重复实例化printName方法,因为printName方法在原型链上,如果当前new10个People对象,原型链上printName不会重复实例化,所有的对象都会共用原型链上的方法,这样就会节约空间。

2. 如下代码中call的作用是什么?

function Person(name, sex) {
    this.name = name;
    this.sex = sex;
}
function Male(name,sex,age) {
    Person.call(this, name, sex); //这里的call是什么作用?
    this.age = age;
}
var mal = new Male('java', '女', 2);
mal.hasOwnProperty('printName'); //false

call 调用Person函数 第一个参数this指向Male,使Male函数实现构造函数继承,获取Person下的属性

hasOwnProperty()方法会返回一个布尔值,指示对象是否具有指定的属性作为自身(不继承)属性。

3.实现一个完整的继承

function Person(name, sex) {
    this.name = name;
    this.sex = sex;
}

Person.prototype.printName = function () {
    console.log(this.name);
}

function Male(name, sex, age) {
    Person.call(this, name, sex); //这里的call是什么作用?
    this.age = age;
}

Male.prototype = new Person();
Male.prototype.getAge = function () {
    console.log(this.age);
}

var mal = new Male('javascript', '女', 2);
mal.printName();
mal.getAge();

 

posted @ 2017-05-12 14:14  荆棘中的百合花  阅读(274)  评论(0编辑  收藏  举报