<tfoot id='qaOZf'></tfoot>
    1. <legend id='qaOZf'><style id='qaOZf'><dir id='qaOZf'><q id='qaOZf'></q></dir></style></legend>

        <bdo id='qaOZf'></bdo><ul id='qaOZf'></ul>

      <small id='qaOZf'></small><noframes id='qaOZf'>

      1. <i id='qaOZf'><tr id='qaOZf'><dt id='qaOZf'><q id='qaOZf'><span id='qaOZf'><b id='qaOZf'><form id='qaOZf'><ins id='qaOZf'></ins><ul id='qaOZf'></ul><sub id='qaOZf'></sub></form><legend id='qaOZf'></legend><bdo id='qaOZf'><pre id='qaOZf'><center id='qaOZf'></center></pre></bdo></b><th id='qaOZf'></th></span></q></dt></tr></i><div id='qaOZf'><tfoot id='qaOZf'></tfoot><dl id='qaOZf'><fieldset id='qaOZf'></fieldset></dl></div>

        JavaScript原型链及常见的继承方法

        时间:2023-12-09

            <bdo id='ey0kM'></bdo><ul id='ey0kM'></ul>
            <i id='ey0kM'><tr id='ey0kM'><dt id='ey0kM'><q id='ey0kM'><span id='ey0kM'><b id='ey0kM'><form id='ey0kM'><ins id='ey0kM'></ins><ul id='ey0kM'></ul><sub id='ey0kM'></sub></form><legend id='ey0kM'></legend><bdo id='ey0kM'><pre id='ey0kM'><center id='ey0kM'></center></pre></bdo></b><th id='ey0kM'></th></span></q></dt></tr></i><div id='ey0kM'><tfoot id='ey0kM'></tfoot><dl id='ey0kM'><fieldset id='ey0kM'></fieldset></dl></div>
              • <small id='ey0kM'></small><noframes id='ey0kM'>

                <legend id='ey0kM'><style id='ey0kM'><dir id='ey0kM'><q id='ey0kM'></q></dir></style></legend>

                  <tbody id='ey0kM'></tbody>
                <tfoot id='ey0kM'></tfoot>
                1. JavaScript原型链及常见的继承方法

                  什么是原型链

                  在JavaScript中,每个对象都有一个原型对象,原型对象又有自己的原型对象,形成了一条链,我们称之为原型链。在这条链上,如果查找某个属性或方法(即某个属性或方法不存在于当前对象上),则会一直向上查找直到找到该属性或方法或查找到原型链的顶层,如果还没有找到,则返回undefined。

                  常见的继承方法

                  在JavaScript中,有很多种实现继承的方法,下面就来介绍几种常见的继承方法。

                  1. 原型链继承

                  原型链继承是最基本的继承方式之一,它的实现思路是将子类的原型对象指向父类的实例对象。

                  function Parent() {
                    this.name = 'parent';
                  }
                  Parent.prototype.sayHello = function () {
                    console.log('hello');
                  };
                  
                  function Child() {
                    this.age = 18;
                  }
                  Child.prototype = new Parent();
                  
                  var child = new Child();
                  console.log(child.name); // parent
                  child.sayHello(); // hello
                  

                  上面的代码中,我们创建了一个父类Parent和一个子类Child。在子类的构造函数中,我们没有初始化父类的属性和方法,而是将子类的原型对象指向了父类的实例(Child.prototype = new Parent())。这样子类就可以获得父类的属性和方法了。

                  缺点:

                  • 原型对象会被所有子类实例共享,一个实例修改原型对象,会影响到所有实例
                  • 无法向父类构造函数传递参数

                  2. 构造函数继承

                  构造函数继承是通过在子类的构造函数中调用父类的构造函数来实现的。

                  function Parent(name) {
                    this.name = name;
                  }
                  Parent.prototype.sayHello = function () {
                    console.log('hello');
                  };
                  
                  function Child(name, age) {
                    Parent.call(this, name);
                    this.age = age;
                  }
                  
                  var child = new Child('child', 18);
                  console.log(child.name); // child
                  child.sayHello(); // TypeError: child.sayHello is not a function
                  

                  上面的代码中,我们创建了一个父类Parent和一个子类Child。在子类的构造函数中,我们调用了父类的构造函数,并传递子类的属性。由于我们只是调用了父类构造函数,没有使用父类原型对象,所以子类无法像原型链继承时一样访问父类的原型方法。

                  缺点:

                  • 父类原型中的属性和方法无法被子类继承
                  • 父类的构造函数会被多次调用

                  3. 组合继承(原型链继承 + 构造函数继承)

                  组合继承是在原型链继承和构造函数继承的基础上,将二者结合起来。

                  function Parent(name) {
                    this.name = name;
                  }
                  Parent.prototype.sayHello = function () {
                    console.log('hello');
                  };
                  
                  function Child(name, age) {
                    Parent.call(this, name);
                    this.age = age;
                  }
                  Child.prototype = new Parent();
                  Child.prototype.constructor = Child;
                  
                  var child = new Child('child', 18);
                  console.log(child.name); // child
                  child.sayHello(); // hello
                  

                  上面的代码中,我们创建了一个父类Parent和一个子类Child。在子类的构造函数中,我们调用了父类的构造函数,并传递子类的属性。在子类的原型对象上,我们使用了父类的实例,这样子类就能够获得父类的所有属性和方法了。

                  缺点:

                  • 父类的构造函数会被多次调用

                  示例说明

                  1. 深度克隆对象

                  function deepClone(obj) {
                    var result = Array.isArray(obj) ? [] : {};
                    for (var key in obj) {
                      if (obj.hasOwnProperty(key)) {
                        var value = obj[key];
                        if (typeof value === 'object' && value !== null) {
                          result[key] = deepClone(value);
                        } else {
                          result[key] = value;
                        }
                      }
                    }
                    return result;
                  }
                  
                  var obj1 = {a:1,b:{c:2}};
                  var obj2 = deepClone(obj1);
                  console.log(obj1 === obj2); // false
                  console.log(obj1.b === obj2.b); // false
                  

                  上面的代码中,我们使用递归的方式深度克隆了一个对象。

                  2. 实现继承

                  function inheritObject(o) {
                    function F() {}
                    F.prototype = o;
                    return new F();
                  }
                  
                  var person = {
                    name: 'person',
                    sayHello: function () {
                      console.log('hello');
                    }
                  };
                  
                  var student = inheritObject(person);
                  console.log(student.name); // person
                  student.sayHello(); // hello
                  

                  上面的代码中,我们定义了一个inheritObject函数,用于实现对象的继承。在函数中,我们创建了一个空函数,并将其原型对象指向父对象,最后实例化该空函数,返回一个新的对象,这个对象就是一个继承了父对象属性和方法的新对象。

                  上一篇:javascript学习笔记(十七) 检测浏览器插件代码 下一篇:基于JS实现带动画效果的流程进度条

                  相关文章

                  <i id='8k4wZ'><tr id='8k4wZ'><dt id='8k4wZ'><q id='8k4wZ'><span id='8k4wZ'><b id='8k4wZ'><form id='8k4wZ'><ins id='8k4wZ'></ins><ul id='8k4wZ'></ul><sub id='8k4wZ'></sub></form><legend id='8k4wZ'></legend><bdo id='8k4wZ'><pre id='8k4wZ'><center id='8k4wZ'></center></pre></bdo></b><th id='8k4wZ'></th></span></q></dt></tr></i><div id='8k4wZ'><tfoot id='8k4wZ'></tfoot><dl id='8k4wZ'><fieldset id='8k4wZ'></fieldset></dl></div>

                    1. <legend id='8k4wZ'><style id='8k4wZ'><dir id='8k4wZ'><q id='8k4wZ'></q></dir></style></legend>
                    2. <tfoot id='8k4wZ'></tfoot>

                      <small id='8k4wZ'></small><noframes id='8k4wZ'>

                        <bdo id='8k4wZ'></bdo><ul id='8k4wZ'></ul>