__x__(79)1016第十五天__ JavaScript 对象的继承

对象的继承

大部分面向对象的编程语言,都是通过“类”(class)实现对象的继承。

传统上,JavaScript 语言的继承不通过 class,而是通过“原型对象”(prototype)实现,称之为 JavaScript 的原型链继承

JavaScript 继承机制的设计思想就是,原型对象 prototype 的所有属性和方法,都能被实例对象共享

ES6 引入了 class 语法

  • 构造函数的缺点
    • 同一个构造函数的多个实例之间,无法共享属性,从而造成对系统资源的浪费

      • function Cat(name, color) {
            this.name = name;
            this.color = color;
            this.bar = function () {
                console.log(‘喵喵‘);
            };
        }
        
        var cat1 = new Cat(‘大毛‘, ‘白色‘);
        var cat2 = new Cat(‘二毛‘, ‘黑色‘);
        
        cat1.meow === cat2.meow    // false

        cat1 和 cat2 是同一个构造函数的两个实例,它们都具有 bar 方法。由于 bar 方法是生成在每个实例对象上面,所以两个实例就生成了两次。

    • 也就是说,每新建一个实例,就会新建一个 bar方法。这既没有必要,又浪费系统资源,因为所有 bar 方法都是同样的行为,完全应该共享
    • 这个问题的解决方法,就是 JavaScript 的原型对象(prototype)
  • JavaScript 的原型对象

    • JavaScript 继承机制的设计思想就是,原型对象的所有属性和方法,都能被实例对象共享
    • 属性和方法定义在原型上,那么所有实例对象就能共享,不仅节省了内存,还体现了实例对象之间的联系
    • JavaScript 规定,每个函数都有一个 prototype 属性,指向一个对象。
      • 对于普通函数来说,该属性基本无用。但是,对于构造函数来说,生成实例的时候,该属性会自动成为实例对象的原型

        • function Animal(name) {
              this.name = name;
          }
          Animal.prototype.color = ‘white‘;
          
          var cat1 = new Animal(‘大毛‘);
          var cat2 = new Animal(‘二毛‘);
          
          cat1.color    // ‘white‘
          cat2.color    // ‘white‘
      • 原型对象的作用,就是定义所有实例对象共享的属性和方法。
    • 原型链

      • 当调用某对象的属性或者方法时,首先在自身作用域中寻找,然后到原型对象中寻找,再到原型对象的原型对象中寻找,直到找到 Object 。如果始终没找到就返回 undefined。
      • JavaScript 规定,所有对象都有自己的原型对象(prototype)。
        • 一方面,任何一个对象,都可以充当其他对象的原型;
        • 另一方面,由于原型对象也是对象,所以它也有自己的原型。
        • 因此,就会形成一个“原型链”(prototype chain):对象到原型,再到原型的原型……

原文地址:https://www.cnblogs.com/tianxiaxuange/p/9800827.html

时间: 2024-11-05 21:43:05

__x__(79)1016第十五天__ JavaScript 对象的继承的相关文章

__x__(78)1016第十五天__ JavaScript 面向对象

面向对象编程(Object Oriented Programming,缩写为 OOP) 是目前主流的编程范式. 是单个实物的抽象, 是一个容器,封装了属性(property)和方法(method),属性是对象的状态,方法是对象的行为(完成某种任务). 将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟. 每一个对象都是功能中心,具有明确分工,可以完成接受信息.处理数据.发出信息等任务. 对象可以复用,通过继承机制还可以定制. 具有灵活.代码可复用.高度模

__x__(64)0925第十天__ JavaScript 对象的 toString() 方法改变输出

JavaScript 对象的 toString() 方法改变输出 在平常,我们 console.log(对象);    // 会打印 [Object Object] 但是我们想要更详细的输出,此时,我们可以重写 对象.toString() 方法 Person.toString = function(){ return "Person ["+this.name+" , "+this.gender+","+this.age+"]"

第十五篇:JavaScript 之 Dom操作

一.后台管理页面布局 二.JavaScript函数 三.eval以及时间操作 四.JavaScript作用域 五.JavaScript面向对象模型 六.DOM选择器 七.DOM事件操作 八.DOM绑定事件的分离绑定方法 原文地址:https://www.cnblogs.com/hanfuming/p/8359285.html

第一百四十五节,JavaScript,同步动画

JavaScript,同步动画 将上一节的,移动透明动画,修改成可以支持同步动画,也就是可以给这个动画方法多个动画任务,让它同时完成 原理: 向方法里添加一个属性,这个属性是一个对象,同步动画属性,属性值为对象,对象里面是,动画方式:目标量,组合的键值对,只能动画方式加目标量的键值对 /** yi_dong_tou_ming()方法,动态改变css属性说明 * * yi_dong_tou_ming()方法,将一个元素,进行一下动画操作 * 1,x将元素横向左移动或者右移动 * 2, y将元素竖向

第一百三十五节,JavaScript,封装库--拖拽

JavaScript,封装库--拖拽 封装库新增1个拖拽方法 /** tuo_zhuai()方法,将一个弹窗元素实现拖拽功能 * 注意:一般需要在css文件将元素里的某一个区块光标设置成提示可以拖拽,如:cursor: move; * 无参 **/ feng_zhuang_ku.prototype.tuo_zhuai = function () { if (this.jie_dian.length == 1) { var yan_su = null; for (var i = 0; i < th

C#与数据库访问技术总结(十五)之 DataAdapter对象代码示例

DataAdapter对象代码示例 下面的代码将说明如何利用DataAdapter对象填充DataSet对象. private static string strConnect=" data source=localhost;uid=sa;pwd=aspent;database=LOGINDB" string sqlstr=" select * from USER "; //利用构造函数,创建DataAdapter SqlDataAdapter da=new Sql

oj刷题——第十五周C++习题 对象转换

Description 定义一个Teacher(教师)类(教师号,姓名,性别,薪金)和一个Student(学生)类(学号,姓名,性别,成绩),二者有一部分数据成员是相同的,num(号码),name(姓名),sex(性别).编写程序,将一个Student对象(学生)转换为Teacher(教师)类,只将以上3个相同的数据成员移植过去.可以设想为: 一位学生大学毕业了,留校担任教师,他原有的部分数据对现在的教师身份来说仍然是有用的,应当保留并成为其教师数据的一部分. Input 一个教师的信息和一个学

JAVA学习第三十五课(常用对象API)- 集合框架(三)—Vector、LinkedList、ArrayList集合演示

集合框架构成图 摘自百度图片 一.Vector集合 演示 虽然Vector已经不常用了,但是还是要了解一下其中的方法 import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Vector

C++学习笔记(十五):vector对象在内存空间中是如何增长的

vector对象在内存空间中是如何增长的   我们都知道vector对象是动态存储的,从这一点看有点像链表,可以动态的增加或减少元素.我们也知道链表中是有指针变量,专门用于存储上一个和下一个元素的地址.正是因为这两个指针的存在,我们才能做到动态的存储数据,即不用像数组那样必须事先申请好空间.链表的缺点就是不能够快速的随机访问其中元素,必须通过指针层层查找. 但是,vector既可以实现动态存储数据,而且支持快速随机访问(用下标或者指针访问元素).对于能够用下标查找的数据类型,其存储方式必定是连续