javascript的基础知识及面向对象和原型属性

自己总结一下javascript的基础知识,希望对大家有用,也希望大家来拍砖,毕竟是个人的理解啊

1.1 类型检查:typeof(验证数据类型是:string

var num = 123;
console.log(typeof num); //

1.2 in 运算符

作用:判断指定属性是否存在于指定的对象中。

如果指定的属性存在于指定的对象中,则 in 运算符会返回 true。

语法:
属性 in 对象

返回值:true 或者 false

示例:
var obj = {
    age: 18
};
var hasAge = "age" in obj;
console.log(hasAge); //
  • 问题:如何判断对象存在某个属性或方法?
1 in
2 浏览器能力检测

1.3 值类型和引用类型(重要)

值类型:变量中存储的是数值本身
引用类型:变量中存储的是数据的引用(地址)

对象中的属性可以是值类型也可以是引用类型
  • 面试题
var o = new Object();
function foo(obj) {
    obj.name = "腐女";
    obj = new Object();
    obj.name = "屌丝";
}
foo(o);
console.log(o.name); //

1.4 逻辑中断

||
如果第一个为真 就返回第一个表达式, 如果为假 则返回第二个表达式
&&
如果第一个为假 就返回第一个表达式, 如果为真则返回第二个表达式
  • 练习:
function fn(num) {
    // 如果传入num,就打印num的值
    // 如果没有传入 就打印 没有参数
}

1.5 delete

作用:删除一个对象的属性。
语法:delete 属性名
返回值: true 或 false

用法:
1 删除数组中的元素
2 删除对象的属性或方法
3 删除没有用 var 声明 变量

1.6 try-catch

// 语法:
try {
    // 可能出现错误的代码
} catch ( e ) {
    // 出现错误会执行这里的代码
} finally { // 可选
    // 无论是否出现异常, 最后执行
}

// 手动抛出异常
throw new Error("别瞎搞");
throw "这都行???";

1.7 函数声明和函数表达式的区别

  • 函数声明不允许出现在其他中
// 函数声明
function foo() {}

// 函数表达式
var foo = function foo() {};

// 不推荐这么做!!
if(true) {
    function f() {
        console.log(true);
    }
}

f();

概念:语句和表达式

表达式:(有值)
表达式(expression)是JavaScript中的一个短语,JavaScript解释器会将其计算出一个值。
表达式可以是:数据 或者 数据和运算符的组合
例如:1、"abc"、true、1 + 2、i++、a === b ? a : b 、a = 1

语句:(带分号)
语句是JavaScript的句子或命令,以分号结束。
var a = 1;

2. 面向对象

2.1 为什么要面向对象?

面试中如何回答,什么是面向对象?

  • 1 面向对象和面向过程的异同
  • 2 在JavaScript中面向对象的表现形式
  • 3 其他语言中面向对象的表现形式(了解)

2.1.1 面向对象和面向过程的区别

  • jQuery创建对象和js创建对象对比
// jQuery
$("body").append("<p>jQuery创建节点就是如此潇洒</p>");

// js
var p = document.createElement("p");
var txt = document.createTextNode("creat E..,creat T..真麻烦");
p.appendChild(txt);

document.body.appendChild(p);
  • 面向对象和面向过程解释
面向过程:所有的细节、步骤、过程,要一步一步亲历亲为(执行者)
面向对象:找到能完成这个事情的对象,让它帮你完成就行(调度者)

生活中的例子:
做饭(叫外卖)
开公司
  • 问题:面向对象这么好,面向过程就没用了?面向对象是对面向过程的一个封装
  • 案例:给div和p添加红色边框
// 通过标签名获取元素
function tag(tagStr) {
    return document.getElementsByTagName(tagStr);
}

var divs = tag("div");
for(var i = 0; i < divs.length; i++) {
    divs[i].style.border = "1px dotted red";
}

var ps = tag("p");
for(var i = 0; i < ps.length; i++) {
    ps[i].style.border = "1px dotted red";
}
  • 练习:写一个通过id属性获取元素的函数

2.1.2 函数封装的问题

  • 1 全局污染(变量在全局范围内有效)
  • 2 大量的函数无法管理
  • 3 使得维护变得困难

2.1.3 使用面向对象方式组织代码

// 使用对象
var itcast = {
    id: function(idStr) {
        return document.getElementById(idStr);
    },
    tag: function(tagStr) {
        return document.getElementsByTagName(tagStr);
    }
};

2.2 面向对象优势(解决函数封装问题)

  • 封装代码,使代码更好维护
  • 减少全局污染
  • 将功能相近的代码组织到一起维护方便,找错方便
var itcast = {
    // 元素获取模块
    getElem: {
        tag: function() {},
        id: function() {}
    },
    // 样式模块
    css: {
        addStyle: function() {},
        removeStyle: function() {},
        hasStyle: function() {}
    }
};

2.2.1 面向对象的基本模型

  • 1 将数据与功能封装成函数(方法)
  • 2 将相关的功能绑定到一起(对象)
  • 3 将功能进行分组(模块)

3. 常用DOM操作

3.1 四字总结:增删改查

3.1.1 获取元素操作

getElementById getElementsByTagName getElementsByClassName

3.1.2 元素节点操作

appendChild insertBefore removeChild replaceChild cloneNode
createElement createTextNode(创建文本节点)

3.1.3 属性节点操作

getAttribute setAttribute removeAttribute

3.1.4 常用DOM属性

className innerHTML innerText/textContent value
children

3.2 DOM就是一个非常典型的面向对象,所有的节点都是对象

在DOM中所有的东西全部都是对象,所以,使用DOM非常简单方便

jQuery中所有的东西也都是对象

4. 面向对象

  • 案例:写一个对象描述一个人要求有姓名、年龄、性别、sayHello

4.1 对象字面量(直接量)

4.1.1 对象是键值对的集合

  • 属性访问语法:点运算符 和 []
// json 的表示法, 对象的直接量(字面量)
var p = {
    name: "jim",
    age: 19,
    sex: "男",
    sayHello: function() {
        alert("你好,哈哈哈哈");
    }
};

p.sayHello();
// 此时可以把对象称为:关联数组
p["sayHello"]();
  • 字面量的缺点:无法复用
例如:
描述一个商品 Goods(name, price, img, count, pDate)

假如有 100 件

4.2 构造函数

  • 优势:可复用

4.2.1 构造函数使用注意点(重点)

  • 1 函数名以大写字母开头(推荐)
  • 2 不需要返回值
  • 3 为对象添加成员使用 this.成员名 = 值
  • 4 创建对象使用 new 关键字
var Person = function() {
    this.name = "jim";
    this.age = 19;
    this.gender = "男";

    this.sayHello = function() {
        alert("你好,哈哈哈哈");
    };
};
// 创建对象(构造函数Person的对象)
var p = new Person();
// 访问对象的 属性
console.log(p.name);
// 访问对象的 方法
p.sayHello();
  • 案例:修改 Person 为带参数的形式
  • 练习:
写一个学生 Student, 要求有 姓名性别年龄和课程分数(语文, 数学, 英语)和说话的方法

4.3 函数参数问题

  • 案例:求三角形面积( s = d * h / 2)
// 不使用函数
var area = 10 * 10 / 2;

// 封装成函数
function getArea() {
    var area = 10 * 10 / 2;
    return area;
}

// 改进
function getArea(bottom, height) {
    return bottom * height / 2;
}
getArea(10, 20);

4.3.1 函数参数注意点

  • 1 把函数参数看作是变量,只能在函数内部使用
  • 2 函数调用时参数传入顺序不能颠倒
  • 3 参数的值是在函数被调用的时候通过传入的参数设置的值
  • 4 函数调用时不传入参数,则函数内部获取参数的值为:undefined
  • 练习:写一个函数打印一段文字,要求:传入什么内容,就打印什么内容

4.3.2 形参和实参

形参(形式参数),即函数定义时的参数,只起到占位的作用,等到函数被调用的时候,会被传入的具体值代替。【联想数学公式】 s = d * h / 2;

实参(实际参数),即函数被调用时的参数,是一个具体的值或者表达式(1、"老司机"、true、[2, 2]、{ name: "two"} 等)

4.4 原型(prototype)

4.4.1 方法放在构造函数中的缺点

  • 浪费内存
构造函数中的属性和方法,会在调用的时候被处理,即会消耗内存。

new 出来的对象,都是一个单独副本
new 一个对象就占用一份内存,new 多少对象就占用多少份内存。

但是对于构造函数中的方法来说,每个对象的方法都是相同的(或者说应该是被共享的)

对于典型的淘宝商品详情页,经测试发现,每增加一个 DOM 节点,会导致首屏渲染时间延迟约 0.5ms

4.4.2 原型的说明

  • 一个对象的原型就是:构造函数的prototype属性的值
  • 只要是函数就有 prototype 属性,即函数的原型属性
  • 函数的原型属性(prototype)的类型是:"object"
  • 由 构造函数 创建出来的对象,会默认链接到其构造函数的这个属性(prototype)的值上
  • 构造函数的 prototype 属性的作用是:实现数据共享
function Person() {}
// prototype 即 原型
Person.prototype.legs = 2;

var p = new Person();
console.log(p.legs);

4.4.3 属性查找规则

在访问对象的某一个属性 (方法)的时候:

1 首先会在当前对象中查找有没有该属性
2 如果当前对象没有, 就会在构造方法的定义规则中查找(当前对象)
3 如果没有, 就会到与对象联系起来的 构造函数的 prototype 属性的值中找

4.5 利用原型改良构造函数

// 对象会到 与它联系的 prototype 中找数据
// 可以考虑将共享的数据, 放到 里面
function Person(name) {
    this.name = name;
}
Person.prototype.sayHello = function() {
    alert(this.name);
};

var p = new Person();
p.sayHello();
  • 原则:只将公共的属性和方法放到 prototype 中

4.5.1 属性修改和读取的区别

获取操作:
遵循属性查找原则

赋值操作(只与当前对象有关):
只会操作对象本身,如果对象中没有该属性则创建该属性,并赋值;如果对象中有,则修改

4.6 prototype 和 __proto__

  • __proto__ 是非标准属性
对象中有一个属性 叫 __proto__
对象的 __proto__ 与创建它的构造函数的 prototype 是一个东西
function F() {}
var o = new F();

console.log(o.__proto__ === F.prototype);
  • 术语
F.prototype  原型属性
f.__proto__  原型对象

F.prototype 是 构造函数F的 原型属性
f.__proto__ 是 对象f的     原型对象
时间: 2024-12-20 12:14:11

javascript的基础知识及面向对象和原型属性的相关文章

整理JavaScript高级基础知识

整理JavaScript高级基础知识 因为空余时间很多..所以博客更新频率得相对频繁些.. 原型以及原型链 考察原型以及原型链: var object = {} object.__proto__ === Object.prototype // 为 true var fn = function(){} fn.__proto__ === Function.prototype // 为 true fn.__proto__.__proto__ === Object.prototype // 为 true

Java基础知识:面向对象&类图

类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称.在系统中,每个类都具有一定的职责,职责指的是类要完成什么样的功能,要承担什么样的义务.一个类可以有多种职责,设计得好的类一般只有一种职责.在定义类的时候,将类的职责分解成为类的属性和操作(即方法).类的属性即类的数据职责,类的操作即类的行为职责.设计类是面向对象设计中最重要的组成部分,也是最复杂和最耗时的部分. 1.面向对象特性 1)抽象 2)继承 3)封装 4)多态 2.类图: 在软件系统

[JavaScript]ES5基础知识总结

1.JavaScript是一门动态语言,ES6的出现弥补了Js在大型项目上的乏力(有了"类"). 以下是关于ES5的基础知识: 2. JavaScript 与C++或Java 这种传统的面向对象语言不同,它实际上压根儿没有类.该语言的一切都是基于对象的,其依靠的是一套原型(prototype)系统.而原型本身实际上也是一种对象. 3. 封装:封装概念常由两部分组成:(1)相关的数据(用于存储属性)(2)基于这些数据所能做的事(所能调用的方法) 4. 在JavaScript 中,还有一种

Java基础知识之面向对象(1)

什么是面向对象: 比如我们想做一个盒子,先想一下盒子的样子,然后找具体的工具来做出我们想要的盒子,这个过程就是面向对象. 面向对象的特征 封装.继承.多态 封装:内部资源对外部不可见 继承:扩展现有类的功能 多态:方法可以重载,对象可以有多个形态 类与对象的理解 类:具有相同特征的一类事物(如:两个眼睛,一个鼻子,一个嘴的人,人就是一个类), Java中定义类的具体方法: class 类名称{ 成员变量: .... 成员方法: } 对象:一个类的具体体现,对于上面说的人,任何一个个体都是一个对象

JavaScript 之基础知识

JavaScript 基础知识 JavaScript 是属于网络的脚本语言! JavaScript 被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies,以及更多的应用. JavaScript 是因特网上最流行的脚本语言. JavaScript 很容易使用!你一定会喜欢它的! JavaScript 简介 在数百万张页面中,JavaScript 被用来改进设计.验证表单.检测浏览器.创建cookies,等等等等.JavaScript 是因特网上最流行的脚本语言,并且可在所有主要的

JavaScript语言基础知识总结

1: JavaScript  DOM的基本操作: 2:JavaScript变量的用法 3:JavaScript函数基础 4:JavaScript流程语句 5 : JavaScript数据类型 6:JavaScript数组的应用 7:JavaScript运算符 8:JavaScript正则表达式 9:JavaScript字符串操作函数 10: window 操作对象

Js基础知识(二) - 原型链与继承精彩的讲解

作用域.原型链.继承与闭包详解 注意:本章讲的是在es6之前的原型链与继承.es6引入了类的概念,只是在写法上有所不同,原理是一样的. 几个面试常问的几个问题,你是否知道 instanceof的原理 如何准确判断变量的类型 如何写一个原型链继承的例子 描述new一个对象的过程 也许有些同学知道这几个问题的答案,就会觉得很小儿科,如果你还不知道这几个问题的答案或者背后所涉及到的知识点,那就好好看完下文,想必对你会有帮助.先不说答案,下面先分析一下涉及到的知识点. 什么是构造函数 JavaScrip

JavaScript基础知识十五(原型链批量设置公有属性)

function Fn(){ this.x = 100; } /* 1.把原来原型指向的地址赋值给我们的pro,现在它们 操作的是同一个内存空间*/ var pro = Fn.prototype; pro.getA =function(){}; pro.getB =function(){}; pro.getC =function(){}; /*2.重构原型的方式->自己新开辟一个堆内存,存储我们公有的. 属性和方法,把浏览器原来给Fn.prototype开辟的那个替换掉*/ Fn.prototy

Javascript入门基础知识和在HTML中的引用方式以及与JAVA之间的关系

JavaScript的基本语法: 一.执行顺序 JavaScript程序是按照出现在HTML文档中出现的顺序逐行执行的,如果需要在整个HTML文档中执行,最好将其放在HTML文件标签中.某些代码,如函数体内的代码,不会被立即执行,只有当所在函数被其他程序调用时,该代码才会被执行. 二.区分大小写 JavaScript是严格区分大小写的.例如str和Str这是两个完全不同的变量. 三.分号和空格 在JavaScript中,语句的":"是可有可无的,但大家最好每一句末尾都加上":