继承相关问题

2017-06-10  本文已影响0人  七_五

1、继承有什么作用?

在一个基于类的语言(如Java)中,继承(inheritance)提供两个有用的服务。首先,它是代码重用的一种形式,若一个新的类与另一个已存在的类大部分相似,那么我们通过继承可以减少很多不必要的代码;其次类继承的好处是引入了一套类型系统的规范,无需编写显试类型转换的代码。

而JavaScript是作为一门弱类型的语言,是不需要类型转换的,也没有原生的继承机制。JavaScript是作为基于原型的语言,这意味着对象需要从其他的对象中继承,在JavaScript中继承是:指一个对象直接使用另一对象的属性和方法

2、下面两种写法有什么区别?

//方法1
function People(name, sex){
    this.name = name;
    this.sex = sex;
    this.printName = function(){        //将printName方法定义在People构造对象上,当构造的对象比较多的时候,会影响性能,且有点混乱
        console.log(this.name);
    }
}
var p1 = new People('饥人谷', 2)

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

Person.prototype.printName = function(){        /将printName方法定义在People的原型链上,当new一个People可以通过原型链来获取这个方法,一般推荐使用这种
    console.log(this.name);
}
var p1 = new Person('若愚', 27);

3、Object.create 有什么作用?兼容性如何?

Object.create()方法使用指定的原型对象和其他属性创建一个新的对象

demo:使用Object.create实现类试继承

//创建一个构造函数Shape
function Shape() {
  this.x =0;
  this.y =0;
}

Shape.prototype.move = function(x, y) {
    this.x += x;
    this.y += y;
};

//创建一个构造函数Rectangle
function Rectangle() {
  Shape.call(this);    //call super constructor.
}

//通过Object.create将Rectangle的原型链指向Shape.prototype
Rectangle.prototype = Object.create(Shape.prototype);

var rect = new Rectangle()          //创建一个新的对象

rect instanceof Rectangle    //true.
rect instanceof Shape    //true.
Object.create是ES5中规定的

4: hasOwnProperty有什么作用? 如何使用?

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

demo:

o = new Object();
o.prop = 'exists';

o.hasOwnProperty('prop');             // 返回 true
o.hasOwnProperty('toString');         // 返回 false,toString是原型链上的属性(Object对象的)
o.hasOwnProperty('hasOwnProperty')    //返回false,hasOwnProperty是原型链上的属性(Object.prototype.hasOwnProperty)

总结:hasOwnProperty其实就是判断一个对象的属性是本身具有的(true),还是需要在原型链上找到的(false)

5、如下代码中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;
}

要知道这里的call有什么用,还是先从这里的this说起吧,之前在我简书的博客深入之作用域链中写过this不是词法作用域,要知道this指向哪里,需要在对象被创建或函数被调用的时候才知道。

这里我们创建一个对象var o = new Male('qi','man' 22),那么我们知道在函数的构造器调用模式中,新对象o首先会创建一个连接到Male.prototype,同时this将被绑定到这个新对象上,那么这个时候构造函数中的this就是指向o对象了,即Person.call(o, name, sex),那么call的作用就很明确了,就是向Person中的this指向o,同时我们可以得出一个结论就是:当new一个新对象的时候,Male和Person中的this都是指向该新对象

6、实现继承

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

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

function Male(name, sex, age){
   Person.call(this,name,sex)
   this.age = age
}

Male.prototype = Object.create(Person.prototype)

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

var ruoyu = new Male('若愚', '男', 27);
ruoyu.getName();
运行结果
上一篇下一篇

猜你喜欢

热点阅读