美文网首页
继承相关问题

继承相关问题

作者: 七_五 | 来源:发表于2017-06-10 19:12 被阅读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();
运行结果

相关文章

  • 继承相关问题

    问题11:继承有什么作用? 概念:继承就是子类拥有父类的属性和方法, 作用: 父类中是更加通用的属性和方法,通过继...

  • 继承相关问题

    1、继承有什么作用? 在一个基于类的语言(如Java)中,继承(inheritance)提供两个有用的服务。首先,...

  • JavaScript的继承相关问题

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

  • JS继承的相关问题

    构造函数、原型对象和实例之间的关系? 每个构造函数都有一个 prototype 属性指向原型对象,原型对象中有一个...

  • this_原型链_继承相关问题

    在函数被直接调用时this绑定到全局对象。在浏览器中,window 就是该全局对象,函数调用模式this指向win...

  • 原型链和继承相关问题

    1、有如下代码,解释Person、 prototype、proto、p、constructor之间的关联。 关联:...

  • 继承相关

    Q:子类继承父类时,重写的变量如何继承?A:重写变量时,变量会在运行时进行类型检查,属于哪个对象就为该对象的变量值...

  • 2017-03-20 C++阶段

    Task List 1. 植物生长问题改写成继承方法 2. 学习多继承友元相关知识 Summary 1. 植物生长...

  • JS this_原型链_继承 相关问题

    this 1,apply、call 、bind有什么作用,什么区别 apply/call:调用一个函数,传入函数执...

  • 继承

    最近在社区进行法律咨询时,关于继承的相关问题越来愈多,下面就有关继承的法律问题整理如下: 第一部分 关于继承权的概...

网友评论

      本文标题:继承相关问题

      本文链接:https://www.haomeiwen.com/subject/dnkcqxtx.html