JavaScript 高级1 :面向对象

移动Web开发字体格式选择(附.woff\.woff2 兼容性) 在做移动开发的时候,UI设计师会提供一些定制字体,来提高产品的视觉效果。对于前端开发来说,就需要考虑字体文件的兼容性和文件的大小,在尽量保证UI效果的情况下,兼容更多的浏览器,减少资源体积,使UI效果、兼容性、性能三者达到平衡。由于中文字体字符集的限制,最终字体包文件都会很大,这里不做讨论。下面主要介绍英文、数字符号场景下几种常见的字体格式。 .ttf TrueType,是Type 1(Ado... 阅读详情

JavaScript 高级1 :面向对象

Date: January 16, 2023
Text: 面向对象、ES6中类和对象、类的继承、面向对象案例


目标:

能够说出什么是面向对象

能够说出类和对象的关系

能够使用 class 创建自定义类型

能够说出什么是继承




面向对象编程介绍

面向过程编程 POP(Process-oriented programming)

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。

举个栗子:将大象装进冰箱,面向过程做法。

Untitled

面向过程,就是按照我们分析好了的步骤,按照步骤解决问题。



面向对象编程 OOP (Object Oriented Programming)

面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作。

举个栗子:将大象装进冰箱,面向对象做法。

先找出对象,并写出这些对象的功能:

  1. 大象对象

进去

  1. 冰箱对象

打开
关闭

  1. 使用大象和冰箱的功能

面向对象是以对象功能来划分问题,而不是步骤。


在面向对象程序开发思想中,每一个对象都是功能中心,具有明确分工。
面向对象编程具有灵活、代码可复用、容易维护和开发的优点,更适合多人合作的大型软件项目。

面向对象的特性:封装性、继承性、多态性

Untitled


面向过程和面向对象的对比

面向过程

优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。
缺点:没有面向对象易维护、易复用、易扩展

面向对象

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护

缺点:性能比面向过程低

用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。




ES6 中的类和对象

面向对象

面向对象更贴近我们的实际生活, 可以使用面向对象描述现实世界事物. 但是事物分为具体的事物和抽象的事物

Untitled

面向对象的思维特点:

  1. 抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板)
  2. 对类进行实例化, 获取类的对象

面向对象编程我们考虑的是有哪些对象,按照面向对象的思维特点,不断的创建对象,使用对象,指挥对象做事情.


对象

现实生活中:万物皆对象,对象是一个具体的事物,看得见摸得着的实物。例如,一本书、一辆汽车、一个人可以是“对象”,一个数据库、一张网页、一个与远程服务器的连接也可以是“对象”。

在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。

对象是由属性和方法组成的:

属性:事物的特征,在对象中用属性来表示(常用名词)

方法:事物的行为,在对象中用方法来表示(常用动词)



类 class

在 ES6 中新增加了类的概念,可以使用 class 关键字声明一个类,之后以这个类来实例化对象。

类抽象了对象的公共部分,它泛指某一大类(class)
对象特指某一个,通过类实例化一个具体的对象

Untitled

类抽象了对象的公共部分,它泛指某一大类(class)

对象特指某一个,通过类实例化一个具体的对象

面向对象的思维特点:

  1. 抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板)
  2. 对类进行实例化, 获取类的对象


创建类

语法:

class name {  
		// class body}
}

创建实例:

var xx = new name();

注意: 类必须使用 new 实例化对象



类 constructor 构造函数

constructor() 方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过 new 命令生成对象实例时,自动调用该方法。如果没有显示定义, 类内部会自动给我们创建一个constructor()

语法:

class Person {  
		constructor(name,age) {   // constructor 构造方法或者构造函数      
		this.name = name;      
		this.age = age;    
		}
}

创建实例:

var ldh = new Person('刘德华', 18); 
console.log(ldh.name)


类添加方法

语法:

class Person {  
		constructor(name,age) {   // constructor 构造器或者构造函数      
		this.name = name;      
		this.age = age;    
		}   
		say() {      
			console.log(this.name + '你好');   
		}
}

创建实例:

var ldh = new Person('刘德华', 18); 
ldh.say()

注意: 方法之间不能加逗号分隔,同时方法不需要添加 function 关键字。

案例:

  • Code:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    
    <body>
        <script>
            // 1. 创建类 class  创建一个 明星类
            class Star {
                // 类的共有属性放到 constructor 里面
                constructor(uname, age) {
                    this.uname = uname;
                    this.age = age;
                }
                sing(song) {
                    // console.log('我唱歌');
                    console.log(this.uname + song);
    
                }
            }
    
            // 2. 利用类创建对象 new
            var ldh = new Star('刘德华', 18);
            var zxy = new Star('张学友', 20);
            console.log(ldh);
            console.log(zxy);
            // (1) 我们类里面所有的函数不需要写function 
            //(2) 多个函数方法之间不需要添加逗号分隔
            ldh.sing('冰雨');
            zxy.sing('李香兰');
        </script>
    </body>
    
    </html>
    



类的继承

继承

现实中的继承:子承父业,比如我们都继承了父亲的姓。
程序中的继承:子类可以继承父类的一些属性和方法。

语法:

class Father{   // 父类
} 
class Son extends Father {  // 子类继承父类
}

实例:

class Father {      
			constructor(surname) {        
				this.surname= surname;      
			}      
			say() {        
					console.log('你的姓是' + this.surname);       
			}
}
class Son extends Father{  // 这样子类就继承了父类的属性和方法

}
var damao= new Son('刘');
damao.say();


super 关键字

super 关键字用于访问和调用对象父类上的函数。可以调用父类的构造函数,也可以调用父类的普通函数

语法:

class Person {   // 父类      
		constructor(surname){         
				this.surname = surname;     
		}
} 
class  Student extends Person {       // 子类继承父类     
		constructor(surname,firstname){          
				super(surname);             // 调用父类的constructor(surname)	
				this.firstname = firstname; // 定义子类独有的属性     
		}
}

注意: 子类在构造函数中使用super, 必须放到 this 前面 (必须先调用父类的构造方法,在使用子类构造方法)

案例1:

super关键字 用于访问和调用对象父类上的函数。可以调用父类的构造函数,也可以调用父类的普通函数。

class Father {    
		constructor(surname) {        
				this.surname = surname;     
		}    
		saySurname() {      
			console.log('我的姓是' + this.surname);    
		}
}
class Son extends Father { // 这样子类就继承了父类的属性和方法    
		constructor(surname, fristname) {         
				super(surname);   // 调用父类的constructor(surname)         
				this.fristname = fristname;     
		}    
		sayFristname() {         
				console.log("我的名字是:" + this.fristname);    
		}
}
var damao = new Son('刘', "德华");
damao.saySurname();  //我的姓是刘
damao.sayFristname(); //我的名字是:德华

案例2:就近原则

继承中的属性或者方法查找原则: 就近原则

  1. 继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的
  2. 继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类的这个方法(就近原则)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        // super 关键字调用父类普通函数
        class Father {
            say() {
                return '我是爸爸';
            }
        }
        class Son extends Father {
            say() {
                // console.log('我是儿子');
                console.log(super.say() + '的儿子');
                // super.say() 就是调用父类中的普通函数 say()
            }
        }
        var son = new Son();
        son.say();
        // 继承中的属性或者方法查找原则: 就近原则
        // 1. 继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的
        // 2. 继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类的这个方法(就近原则)
    </script>
</body>

</html>

案例3:

子类在构造函数中使用super, 必须放到 this 前面 (必须先调用父类的构造方法,在使用子类构造方法)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        // 父类有加法方法
        class Father {
            constructor(x, y) {
                this.x = x;
                this.y = y;
            }
            sum() {
                console.log(this.x + this.y);
            }
        }
        // 子类继承父类加法方法 同时 扩展减法方法
        class Son extends Father {
            constructor(x, y) {
                // 利用super 调用父类的构造函数
                // super 必须在子类this之前调用
                super(x, y);
                this.x = x;
                this.y = y;

            }
            subtract() {
                console.log(this.x - this.y);

            }
        }
        var son = new Son(5, 3);
        son.subtract();
        son.sum();
    </script>
</body>

</html>


三个注意点:

  1. 在 ES6 中类没有变量提升,所以必须先定义类,才能通过类实例化对象.
  2. 类里面的共有属性和方法一定要加this使用.
  3. 类里面的this指向问题.
  4. constructor 里面的this指向实例对象, 方法里面的this 指向这个方法的调用者(比如下面的)

综合案例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <button>点击</button>
    <script>
        var that;
        var _that;
        class Star {
            constructor(uname, age) {
                // constructor 里面的this 指向的是 创建的实例对象
                that = this;
                console.log(this);

                this.uname = uname;
                this.age = age;
                // this.sing();
                this.btn = document.querySelector('button');
                this.btn.onclick = this.sing;
            }
            sing() {
                // 这个sing方法里面的this 指向的是 btn 这个按钮,因为这个按钮调用了这个函数
                console.log(this);

                console.log(that.uname); // that里面存储的是constructor里面的this
            }
            dance() {
                // 这个dance里面的this 指向的是实例对象 ldh 因为ldh 调用了这个函数
                _that = this;
                console.log(this);
            }
        }

        var ldh = new Star('刘德华');
        console.log(that === ldh);
        ldh.dance();
        console.log(_that === ldh);

        // 1. 在 ES6 中类没有变量提升,所以必须先定义类,才能通过类实例化对象

        // 2. 类里面的共有的属性和方法一定要加this使用.
    </script>
</body>

</html>

理解:

构造函数的this指向的是实例对象,成员函数的this指向的是这个函数的调用者,根据上例,成员函数的指向可以是btn,也可以是ldh

比如:this.btn.onclick = this.sing; 前面是ldh调用btn,后面是btn调用sing函数

由此,sing函数里的console.log(this);输出的是<button>点击</button>

如果我们想要在sing()中使用constructor中的this,我们可以在全局中设定一个变量that, 从而在sing()函数中使用这个变量thatjike

注意:this.btn.onclick = this.sing; 这里=后面的sing不要加括号,因为我们需要点击按钮后再运行, 而非直接调用函数




面向对象案例

面向对象版 tab 栏切换

功能需求:

  1. 点击 tab栏,可以切换效果.
  2. 点击 + 号, 可以添加 tab 项和内容项.
  3. 点击 x 号, 可以删除当前的tab项和内容项.
  4. 双击tab项文字或者内容项文字,可以修改里面的文字内容.

抽象对象: Tab 对象

  1. 该对象具有切换功能
  2. 该对象具有添加功能
  3. 该对象具有删除功能
  4. 该对象具有修改功能

添加功能

  1. 点击 + 可以实现添加新的选项卡和内容
  2. 第一步: 创建新的选项卡li 和 新的 内容 section
  3. 第二步: 把创建的两个元素追加到对应的父元素中.
  4. 以前的做法: 动态创建元素 createElement , 但是元素里面内容较多, 需要innerHTML赋值,在appendChild 追加到父元素里面.
  5. 现在高级做法: 利用 insertAdjacentHTML() 可以直接把字符串格式元素添加到父元素中
  6. appendChild 不支持追加字符串的子元素, insertAdjacentHTML 支持追加字符串的元素
  7. insertAdjacentHTML(追加的位置,‘要追加的字符串元素’)
  8. 追加的位置有: beforeend 插入元素内部的最后一个子节点之后
  9. 该方法地址: https://developer.mozilla.org/zh-CN/docs/Web/API/Element/insertAdjacentHTML

删除功能

  1. 点击 × 可以删除当前的li选项卡和当前的section
  2. X是没有索引号的, 但是它的父亲li 有索引号, 这个索引号正是我们想要的索引号
  3. 所以核心思路是: 点击 x 号可以删除这个索引号对应的 li 和 section
  4. 但是,当我们动态删除新的li和索引号时,也需要重新获取 x 这个元素. 需要调用init 方法

编辑功能

  1. 双击选项卡li或者 section里面的文字,可以实现修改功能
  2. 双击事件是: ondblclick
  3. 如果双击文字,会默认选定文字,此时需要双击禁止选中文字
  4. window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
  5. 核心思路: 双击文字的时候, 在 里面生成一个文本框, 当失去焦点或者按下回车然后把文本框输入的值给原先元素即可.
  • Code:HTML index

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>面向对象 Tab</title>
        <link rel="stylesheet" href="./styles/tab.css">
        <link rel="stylesheet" href="./styles/style.css">
    </head>
    
    <body>
    
        <main>
            <h4>
                Js 面向对象 动态添加标签页
            </h4>
            <div class="tabsbox" id="tab">
                <!-- tab 标签 -->
                <nav class="fisrstnav">
                    <ul>
                        <li class="liactive"><span>测试1</span><span class="iconfont icon-guanbi"></span></li>
                        <li><span>测试2</span><span class="iconfont icon-guanbi"></span></li>
                        <li><span>测试3</span><span class="iconfont icon-guanbi"></span></li>
                    </ul>
                    <div class="tabadd">
                        <span>+</span>
                    </div>
                </nav>
    
                <!-- tab 内容 -->
                <div class="tabscon">
                    <section class="conactive">测试1</section>
                    <section>测试2</section>
                    <section>测试3</section>
                </div>
            </div>
        </main>
    
        <script src="js/tab.js"></script>
    </body>
    
    </html>
    
  • Code:JS tab

    var that;
    class Tab {
        constructor(id) {
            // 获取元素
            that = this;
            this.main = document.querySelector(id);
            this.add = this.main.querySelector('.tabadd');
            // li的父元素
            this.ul = this.main.querySelector('.fisrstnav ul:first-child');
            // section 父元素
            this.fsection = this.main.querySelector('.tabscon');
            this.init();
        }
        init() {
                this.updateNode();
                // init 初始化操作让相关的元素绑定事件
                this.add.onclick = this.addTab;
                for (var i = 0; i < this.lis.length; i++) {
                    this.lis[i].index = i;
                    this.lis[i].onclick = this.toggleTab;
                    this.remove[i].onclick = this.removeTab;
                    this.spans[i].ondblclick = this.editTab;
                    this.sections[i].ondblclick = this.editTab;
    
                }
            }
            // 因为我们动态添加元素 需要从新获取对应的元素
        updateNode() {
                this.lis = this.main.querySelectorAll('li');
                this.sections = this.main.querySelectorAll('section');
                this.remove = this.main.querySelectorAll('.icon-guanbi');
                this.spans = this.main.querySelectorAll('.fisrstnav li span:first-child');
            }
            // 1. 切换功能
        toggleTab() {
                // console.log(this.index);
                that.clearClass();
                this.className = 'liactive';
                that.sections[this.index].className = 'conactive';
            }
            // 清除所有li 和section 的类
        clearClass() {
                for (var i = 0; i < this.lis.length; i++) {
                    this.lis[i].className = '';
                    this.sections[i].className = '';
                }
            }
            // 2. 添加功能
        addTab() {
                that.clearClass();
                // (1) 创建li元素和section元素 
                var random = Math.random();
                var li = '<li class="liactive"><span>新选项卡</span><span class="iconfont icon-guanbi"></span></li>';
                var section = '<section class="conactive">测试 ' + random + '</section>';
                // (2) 把这两个元素追加到对应的父元素里面
                that.ul.insertAdjacentHTML('beforeend', li);
                that.fsection.insertAdjacentHTML('beforeend', section);
                that.init();
            }
            // 3. 删除功能
        removeTab(e) {
                e.stopPropagation(); // 阻止冒泡 防止触发li 的切换点击事件
                var index = this.parentNode.index;
                console.log(index);
                // 根据索引号删除对应的li 和section   remove()方法可以直接删除指定的元素
                that.lis[index].remove();
                that.sections[index].remove();
                that.init();
                // 当我们删除的不是选中状态的li 的时候,原来的选中状态li保持不变
                if (document.querySelector('.liactive')) return;
                // 当我们删除了选中状态的这个li 的时候, 让它的前一个li 处于选定状态
                index--;
                // 手动调用我们的点击事件  不需要鼠标触发
                that.lis[index] && that.lis[index].click();
            }
            // 4. 修改功能
        editTab() {
            var str = this.innerHTML;
            // 双击禁止选定文字
            window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
            // alert(11);
            this.innerHTML = '<input type="text" />';
            var input = this.children[0];
            input.value = str;
            input.select(); // 文本框里面的文字处于选定状态
            // 当我们离开文本框就把文本框里面的值给span 
            input.onblur = function() {
                this.parentNode.innerHTML = this.value;
            };
            // 按下回车也可以把文本框里面的值给span
            input.onkeyup = function(e) {
                if (e.keyCode === 13) {
                    // 手动调用表单失去焦点事件  不需要鼠标离开操作
                    this.blur();
                }
            }
        }
    
    }
    new Tab('#tab');
    
  • Code:CSS style

    @font-face {font-family: "iconfont";
      src: url('./iconfont/iconfont.eot?t=1553960438096'); /* IE9 */
      src: url('./iconfont/iconfont.eot?t=1553960438096#iefix') format('embedded-opentype'), /* IE6-IE8 */
      url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAK4AAsAAAAABmwAAAJrAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCCcAp4fwE2AiQDCAsGAAQgBYRtBzAbpQXIrrApw71oi3CCOyzEy8RvE4yIN8TD036/zp03qCYRjaJZNBFFS/gREoRGipQKofjuNrb+9XbTqrmXcqWzfTRDqFqWkhAJzYToaE6LQ7Q30CirRqSKMnj58DdIdrNAdhoTQJa5VGfLrtiAy+lPoAcZdUC57UljTR4TMAo4oL0xiqwYG8YueIHPCdTqYajty/t+bUpmrwvEnUK42lQhLMssVy1UNhzN4kmF6vSQVvMY/T5+HEU1SUXBbti7uBBrx++cgqJULp0GhAgBna5AgSkgE0eN6R1NwTitNt0yAI5VG7wr/8AljmoX7K+zq+tBF1Q8k9JTPWp1AjnJDgCzmM3bU0V31dsvV3M2eC6fHjaGfX/qS7U5Gr58vj6uD0bgxudyrV/OtHHyP+NZnpO1txbktjdY+3FB61+7nxeOzq8niGYnRwT3v3aZxeXf6rrNxl5//49WlEtZUUL1Pj3Bv1EO7MuG2namrCkbvcnApLUJtWpRhv2tzlRLx43kQ7WO2/FW6c5QqDZEZnYKFeosoVK1NdSa5E/XaVM1Ra7BhAEQmk0kjV5QaLbIzG5U6HRRqTkK1DqJtivrjMT1zJaNnIsihAiyQE3JdbszcW0Xiadzdl4d8UO0HSUGNDNXzl2hifYSO5pPjrorgdjUAAavoa5TKDZVUXD3kuuOOzh70fShvUiN2owtNsRxIREIIiATUCYpGO2aqXy/CxEeHcfuaKrLDiGbQ5kcEMsNIK8M5qCmR3mn8RFHOpcECBtlAAwWIZ2OAqV5kQoJXHvShORYBzrDZKhhb3uT8QPlrA3bmsKZV6i89DiTV2o1AAAA') format('woff2'),
      url('./iconfont/iconfont.woff?t=1553960438096') format('woff'),
      url('./iconfont/iconfont.ttf?t=1553960438096') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
      url('./iconfont/iconfont.svg?t=1553960438096#iconfont') format('svg'); /* iOS 4.1- */
    }
    
    .iconfont {
      font-family: "iconfont" !important;
      font-size: 16px;
      font-style: normal;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
    }
    
    .icon-guanbi:before {
      content: "\e676";
    }
    
  • Code:CSS tab

    * {
        margin: 0;
        padding: 0;
    }
    
    ul li {
        list-style: none;
    }
    
    main {
        width: 960px;
        height: 500px;
        border-radius: 10px;
        margin: 50px auto;
    }
    
    main h4 {
        height: 100px;
        line-height: 100px;
        text-align: center;
    }
    
    .tabsbox {
        width: 900px;
        margin: 0 auto;
        height: 400px;
        border: 1px solid lightsalmon;
        position: relative;
    }
    
    nav ul {
        overflow: hidden;
    }
    
    nav ul li {
        float: left;
        width: 100px;
        height: 50px;
        line-height: 50px;
        text-align: center;
        border-right: 1px solid #ccc;
        position: relative;
    }
    
    nav ul li.liactive {
        border-bottom: 2px solid #fff;
        z-index: 9;
    }
    
    #tab input {
        width: 80%;
        height: 60%;
    }
    
    nav ul li span:last-child {
        position: absolute;
        user-select: none;
        font-size: 12px;
        top: -18px;
        right: 0;
        display: inline-block;
        height: 20px;
    }
    
    .tabadd {
        position: absolute;
        /* width: 100px; */
        top: 0;
        right: 0;
    }
    
    .tabadd span {
        display: block;
        width: 20px;
        height: 20px;
        line-height: 20px;
        text-align: center;
        border: 1px solid #ccc;
        float: right;
        margin: 10px;
        user-select: none;
    }
    
    .tabscon {
        width: 100%;
        height: 300px;
        position: absolute;
        padding: 30px;
        top: 50px;
        left: 0px;
        box-sizing: border-box;
        border-top: 1px solid #ccc;
    }
    
    .tabscon section,
    .tabscon section.conactive {
        display: none;
        width: 100%;
        height: 100%;
    }
    
    .tabscon section.conactive {
        display: block;
    }
    
JS面向对象实例、高级 ·  选项卡用面向过程1 window.onload=function () { var oDiv = document.getElementById('div1'); var aDiv = oDiv.getElementsByTagName('div'); var aBtn = oDiv.getElementsByTagName('input'); for (var i=0;i<aB 阅读详情

相关推荐

JavaScript高级实战教程,带你深入学习JS高级应用

在互联网发展的早期,JavaScript就已经成为支持网页内容交互体验的基础技术。随着时间推移,JavaScript业已升级成为互联网的核心技术。 长期以来,我都在学习JavaScript。学JS一时爽,一直学习一直爽。 在学习过程中,接触很多学习资料,图书、视频等不一而足。 今天分享给大家的就是动力节点最新的JavaScript高级篇教程 JavaScript高级主要学习: 继承和原型链 严格模式 JavaScript 类型数组 内存管理 并发模型以及事件循环 JavaScript课程介

Javanewspaper的博客 1332

Web字体格式对比:WOFF2 vs WOFF vs TTF在Source Code Pro中的应用

选择合适的Web字体格式对于提升网站性能和用户体验至关重要。Source Code Pro作为一款优秀的编程字体,提供了多种格式支持,其中WOFF2、WOFF和TTF是最常用的三种Web字体格式。本文将详细分析这三种格式在Source Code Pro字体中的应用差异,帮助你做出最佳的格式选择决策。 ## 🎯 三种字体格式技术特点对比 ### WOFF2格式 - 现代压缩标准 WOFF2(W

gitblog_00922的博客 992

js的高级笔记1:面向过程、面向对象、对象、类、添加属性和方法、类的继承、面向对象的tab栏切换案例

1.面向过程与面向对象 1.1面向过程 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。 1.2面向对象 面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作。 1.3面向过程与面向对象对比 面向过程 面向对象 优点 性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于

小黄呀呀呀的博客 215

CSS自定义字体@font-face:使用方法及format属性

浏览器支持:IE9+,FireFox3.5+,Chrome4.0+,Safari3+,Opera10+,IOS Mobile Safari4.2+浏览器支持:FireFox3.5+,Chrome4.0+,Safari3.1+,Opera10.0+,IOS Mobile Safari4.2+浏览器支持:IE9+, FireFox3.5+, Chrome6+, Safari3.6+,Opera11.1+Windows和Mac上常见的字体格式 这是一种原始格式 因此并没有为网页进行优化处理。浏览器支持:IE4+

m0_72348850的博客 1823

基于的公司考勤系统(程序+开题报告)(开题报告+源码)

我们将研究和设计系统的架构和功能模块,包括员工信息管理模块、部门信息管理模块、考勤信息记录模块、工资信息计算模块、请假信息处理模块、奖惩信息管理模块、公告信息发布模块、上班打卡模块以及加班申请模块等。目的: 本项目旨在设计并实现一个基于的公司考勤系统,通过该系统,可以实现对员工、部门信息、考勤信息、工资信息、请假信息、奖惩信息、公告信息、上班打卡、加班申请等功能的统一管理。基于的公司考勤系统的设计与实现,旨在通过自动化技术提高考勤管理的效率和准确性,为企业管理提供有力的数据支持。最终成品以下面运行环境。

迟限程序设计 997

NVIDIA DGX Spark 深度应用解析:从大模型训练到边缘推理的完整实践指南

内存管理:充分利用统一内存架构,避免不必要的数据传输批处理大小:根据模型大小调整批处理大小以优化内存使用精度选择:在精度损失可接受范围内使用较低精度计算流水线优化:重叠计算和数据传输操作DGX Spark作为一个专门的AI计算平台,在大模型开发的各个阶段都能发挥重要作用。从数据预处理到模型训练,从微调到推理部署,其统一内存架构和强大的计算能力为AI开发者提供了前所未有的本地开发体验。需要注意的是,虽然DGX Spark性能强大,但合理的算法设计和系统优化仍然是获得最佳性能的关键。

time_days的博客 2871

由IconFont引起的svg、ttf、woff、woff2图标的研究及转换

正在研究中,待修改,请勿全信。。。。。。 1、.svg文件: svg文件就是一个xml,定义了文字属性,位置等信息。 svg教程 例子: <?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG...

liu_chenglong的博客 9381

PyTorch转ONNX遇到算子不支持?3种实战解决方案+TensorRT适配技巧

本文针对PyTorch模型导出ONNX时常见的算子不支持问题,提供了从诊断到解决的完整实战指南。首先讲解如何精准定位错误根源,随后详细介绍了三种核心解决方案:注册缺失的符号映射、实现自定义算子,以及为TensorRT开发插件的终极落地方案。文章还分享了构建稳健部署流水线的工程化实践,帮助开发者系统性地解决模型部署中的算子兼容性挑战。

fern8的博客 843

由iconfont引起的svg、ttf、woff、woff2图标的研究及转换(svgs2fonts)

由iconfont引起的svg、ttf、woff、woff2图标的研究及其转换 1.背景 其实很早之前便想通过iconfont来实现图标管理和统一(一方面也是为了偷懒,不,是工程化),然而总总原因拖到了现在。 个人感觉iconfont最大的优势有三点 - 矢量图标。相比切图,至少不会糊。 - 可控颜色。相比切图,至少可以换颜色。 - 方便管理和调用。相比切图,至少不会忘。 - 减少请...

qq_24357165的博客 1万+

4.无限共轭距柯克物镜设计——zemax学习笔记

无限共轭cooker物镜

fly_daerm的博客 1596

MICS-6814多气体传感器与ESP32-C3 Mini接口构建空气监测系统

cararenuity C3 Mini的多个ADC引脚,Wi-Fi和蓝牙LE以及紧凑的设计使其成为嵌入式物联网应用的绝佳选择。在这个项目中,我们将把MICS-6814多气体传感器与基于esp32 -C3的开发板cararenuity C3 Mini连接起来。更多模拟引脚:与ESP8266只有一个ADC引脚不同,基于esp32 -C3的cararenuity C3 Mini提供多个ADC引脚,使其成为多传感器应用的理想选择。紧凑可靠:该板的小尺寸使其成为嵌入式应用的理想选择,而不会牺牲性能。

hie98894的博客 770

JavaScript高级:JavaScript面向对象-1.4面向对象案例

抽象对象: Tab 对象。

shiqing4387的博客 195

Python爬虫:招聘网站岗位要求、薪资与求职者数据爬取与分析

通过本文的教程,我们学习了如何通过 Python 编写招聘数据爬虫,爬取招聘网站上的岗位要求、薪资和求职者数据,并通过数据存储、清洗、分析和可视化,获取有价值的信息。网站如智联招聘、猎云网、前程无忧等,都提供了大量的招聘信息,包括岗位要求、薪资范围、工作经验、学位要求、招聘公司等。本文将介绍如何通过 Python 编写爬虫,爬取招聘网站上的岗位要求、薪资、求职者数据,并通过数据存储、分析和可视化等手段,为求职者或招聘者提供实用的信息和决策支持。通过循环抓取多个页面的数据,可以获取不同岗位的信息。

2201_76125261的博客 722

JavaScript高级:JavaScript面向对象-1.1面向对象编程介绍

就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。面向对象编程具有灵活、代码可复用、容易维护和开发的优点,更适合多人合作的大型软件项目。优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护。用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。面向过程,就是按照我们分析好了的步骤,按照步骤解决问题。

shiqing4387的博客 144

小龙虾们的好伙伴专栏导航

本文系统解析了OpenClaw技术架构,包括Channel层和网关层的设计实现,并与AgentSkills等技术方案进行对比。同时提供了OpenClaw的系列实用指南,涵盖小龙虾培养、客户资源管理、系统自动化巡检以及技术趋势助手构建等应用场景,帮助用户从零成本入门到高效落地应用,实现业务全流程自动化管理。

wend的博客 212

十二种嵌入式通信协议

嵌入式通信协议选型核心要点解析 在嵌入式系统开发中,通信协议选型直接影响项目成败。本文系统梳理了12种主流协议,从三个维度提供选型指南: 板级通信协议: I²C:双线制,适合传感器连接(温湿度、RTC等) SPI:高速全双工,适用于Flash存储、TFT屏等 UART:异步串行,常用于调试日志输出 总线通信协议: CAN:汽车电子首选,支持多主节点和硬件仲裁 LIN:低成本单线方案,适用于车窗控制等场景 RS485:工业自动化主力,最长传输距离1200米 Modbus:工业领域通用协议,支持RTU/TCP格

qq_37999850的博客 248

【第六部分 | JavaScript高级】1:面向对象

本文介绍了JS高级 —— 面向对象的语法

m0_57265007的博客 526

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JavaScript高级:JavaScript面向对象-1.3ES6 中的类和对象

constructor() 方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过 new 命令生成对象实例时,自动调用该方法。在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、面向对象编程我们考虑的是有哪些对象,按照面向对象的思维特点,不断的创建对象,使用对象,指挥对象做事情.现实生活中:万物皆对象,对象是一个具体的事物,看得见摸得着的实物。可以是“对象”,一个数据库、一张网页、一个与远程服务器的连接也可以是“对象”。

shiqing4387的博客 356

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Python高级爬虫之JS逆向+安卓逆向1.7节: 面向对象

比如实现一个在线购物系统,将系统拆分为查看商品,添加商品,订单结算的这三个函数,将其按顺序实现,调用,即可实现一个简单的购物系统。在以上代码中,我们定义了一个名为Rectangle的类,在该类的构造函数中,一共包括两个形参,分别是width与height。这套爬虫教程会系统讲解爬虫的初级,中级,高级知识,涵盖的内容包括基础爬虫,高并发爬虫的设计与开发,js逆向,安卓逆向,反爬策略及应对(反调试,指纹检测,图文验证码,短信验证码等),以及大规模分布式爬虫的设计与开发。面向对象的三大特征: 封装,继承,多态。

1299

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JavaScript高级:JavaScript面向对象-1.2类的继承

继承 现实中的继承:子承父业,比如我们都继承了父亲的姓。 程序中的继承:子类可以继承父类的一些属性和方法。父类的普通函数。//这个sing方法里面的this 指向的是btn这个按钮,因为这个按钮调用了这个函数。//constructor 里面的this指向的是 创建的实例对象。//that里面存储的是cunstructor中的this。// 2. 类里面的共有的属性和方法一定要加this使用.

shiqing4387的博客 210

【jS高级】:三、面向对象高级(1.对象创建模式 2.继承模式)

三、面向对象高级 1.对象创建模式 方式①: Object构造函数模式 套路: 先创建空Object对象, 再动态添加属性/方法 适用场景: 起始时不确定对象内部数据 问题: 语句太多 /* 一个人: name:"Tom", age: 12 */ // 先创建空Object对象 var p = new Object() p = {} //此时内部数据是不确定的 ...

qq_20535249的博客 310

【JS高级进阶】JavaScript初识面向对象

本篇主要讲解了什么是面向对象,如何创建使用类,super关键字的使用以及注意事项(学过Java的小伙伴们就会很容易理解)区分面向对象和面向过程

zhaochen1127的博客 2700

JavaScript高级(1)——js面向对象

js面向对象 学习目标: 能够说出什么是面向对象 能够说出类和对象的关系 能够使用class创建自定义类 能够说出什么是继承 js面向对象编程介绍 面向对象编程介绍 两大编程思想 面向过程和面向对象 面向过程编程POP(Process-oriented programming) 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。 举个例子 面向过程:就是按照我们分析好的步骤,按照步骤解决问题 面向对象编程OOP(Object-orient

curacaolb的博客 1178

JavaScript高级:js中面向对象编程

JavaScript高级:js中面向对象编程:1 引言;2 封装性;3 原型;4 数组扩展案例--> 求和 和 最大值;5 原型对象中的constructor属性;6 对象原型;7 对象原型中的constructor属性;8 上述总结;9 原型继承;10 原型链

xiaoxie_life_study 1357

发掘JavaScript潜力:掌握高级技巧,成为JavaScript编程大师!

众所周知,JavaScript是一种非常流行🔥的编程语言,它已经成为了网页开发的必备技能。但是,在我们从事JavaScript编程的时候,我们却没有完全发掘和利用它的全部潜力。在本文中,我们将分享一些高级的JavaScript技巧,希望帮助优快云的小伙伴更好地理解和掌握JavaScript编程。在本文中,我们介绍了一些JavaScript的高级知识点,如高级数据结构和算法、函数式编程、异步编程和面向对象编程。我们还提供了一些代码示例和实战案例,让掘友们更好地理解和掌握这些技术。

欢迎来到我的前端博客!这里汇集了关于前端开发的最新技术、实用工具和经验分享。我将为你提供详细的教程、代码示例和实战案例,帮助你掌握Web开发的核心概念和技能。不论你是初学者还是有经验的开发者,这个博客都适合你。 5586

JavaScript 高级——详谈面向对象

1.面向过程与面向对象 1.1面向过程 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。 1.2面向对象 面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作。 1.3面向过程与面向对象对比 面向过程 面向对象 优点 性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于

商务合作欢迎私信我 3万+
上一篇: jQuery:入门
下一篇: JavaScript 高级2 :构造函数和原型
CaptainDrake
博客等级 码龄6年 5363粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值