美文网首页
继承相关问题

继承相关问题

作者: 七_五 | 来源:发表于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();
    
    运行结果

    相关文章

      网友评论

          本文标题:继承相关问题

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