面向对象day03

DOM 操作

## 访问由于树关系( 节点 )

## 方法与功能

### 核心内容就是利用 增删改查

### 查询

就是获取元素

1. 标准 DOM API
* doucment.getElementById
* document.getElementsByTagName
* document.getElementsByName
* document.getElementsByClassName
* document.querySelectorAll
2. 亲属访问
3. 属性获取
* getAttribute
* getAttributeNode

### 增加

1. 创建
* document.createEelement 创建元素节点
* document.createTextNode 创建文本节点
* doucment.createAttribute 属性节点
* innerHTML
* innerText
* cloneNode()
2. 加入
* appendChild 追加到结尾处
* innerHTML
* insertBefore 用法?将元素插入到某一个元素的前面
```
父元素.insertBefore( 新元素, 旧元素 );
// 将 新元素 插入到 旧元素 的前面
```
3. 其他
* style 的操作
* setAttribute( 属性名, 属性值 )

### 删除
1. 删除元素
* removeChild
* removeAttributeNode

### 修改

1. 修改节点
* 删除节点再加入
2. 修改样式
* style.xxx = vvv;
* setAttribute
3. 修改文本
* innerHTML
* innerText
* 节点操作
* nodeValue
4. 修改属性
* .xxx = vvv
* setAttribute

# 面试题

1. js 是什么语言
* 基于对象: 没有对象什么事儿都所不了
* 脚本语言: 不严格的定义, 写出来解释执行的语言. 和编译型语言对象( c, c++, java, c# ).
* 基于原型: 和继承有关
2. 出现 undefiend
* 访问数组或对象不存在的成员
* 定义变量为赋值
* 函数没有返回值, 或 return 后没有数据
3. 对数组元素去重( * )
* 利用一个新数组存数据
* 遍历旧数组, 然后在新数组中找是否已存在该数据
* indexOf != -1
4. DOM 操作
* 先获取元素, 设置或修改属性或子节点

# 原型 prototype

## js 的对象比较

由于 js 是解释执行的语言, 那么再代码中出现函数与对象如果重复执行, 会创建多个副本

1. 在代码中重复执行的代码容易出现重复的对象
2. 创建一个 Person 构造函数, 以创建 对象. 要求有 name, age, gender 和 sayHello
3. 代码出现的错误
```
// 1
function Person() {
var o = {};
o.name = ...
return o;
}
// 2
function Person () {
name: ....
age: ....
...
}
```
4. 传统的构造方法的定义方式会影响性能, 容易造成多个对象有多个方法副本. 应该讲方法单独抽取出来. 让所有的对象共享该方法.
5. 可以考虑将方法全部放到外面但是有安全隐患
* 在开发中会引入各种框架或库. 自定义的成员越多, 出现命名冲突的几率越大
* 可能在开发中会有多个构造函数. 每一个构造函数应该有多个方法. 那么就会变得不容易维护.
6. 任意一个对象都会默认的链接到它的原型中
* 创建一个函数. 会附带的创建一个特殊的对象. 该对象使用 函数.prototype 引用. 称其为函数的原型属性.
* 每一个由该函数作为构造函数创建的对象, 都会默认的连接到该对象上.
* 在该对象访问某一个方法或属性的时候, 如果该对象中没有, 就会到这个神秘对象中去查找.

## 传统构造函数的问题

```
function Foo() {
this.sayHello = function () {
}
}
```
1. 由于对象是调用 `new Foo()` 所创建出来的. 因此每一个对象在创建的时候, 函数 sayHello 都会被创建一次
2. 那么每一个对象都含有一个独立的, 不同的, 但是功能逻辑一样的函数. 比如: `{} == {}`
3. 在代码中方法就会消耗性能. 最典型的资源就是内存.
4. 这里最好的办法就是将函数体放在构造函数之外. 那么在构造函数中只需要引用该函数即可
```
function sayHello () {}
function Foo () {
this.say = sayHello;
}
```
5. 会在开发中变得困难: 引入框架危险, 代码繁冗不好维护. 解决办法就是外面的函数如果不占用名字. 而且在函数旗下就好了.
6. 每一个函数在定义的时候, 有一个神秘对象被创建出来.
7. 每一个由构造函数创建的对象都会默认的连接到该神秘对象上.
```
var f1 = new Foo();
var f2 = new Foo();
f1.sayHello(); // 如果 f1 没有 sayHello, 那么就会在 Foo.prototype 中去找
f2.sayGoodBye(); // 如果 f2 没有改方法, 那么就会在 Foo.prototype 中去找
```
8. 由构造函数创建出来的众多对象共享一个对象, 就是 构造函数.prototype
9. 只需要将共享的东西, 重复会多占用内存的东西放到 构造函数.prototype 中, 那么所有的对象就可以共享了.
```
function Foo() {}
Foo.prototype.sayHello = function () {
console.log( ... );
};
var f1 = new Foo();
f1.sayHello();
var f2 = new Foo();
f2.sayHello();

f1.sayHello === f2.sayHello
```
10. 练习: 写一个构造函数 Student, 要求有 name, age, gender, sayHello, study. 要求构造函数带参数.

## 常见错误

1. 写 构造函数.prototype 的时候, 将属性也加到里面.
```
function Person() {}
Person.prototype.name = ‘张三‘;
var p = new Person();
```
2. 赋值的错误
```
function Person() {}
Person.prototype.name = ‘张三‘;
var p1 = new Person();
var p2 = new Person();
p1.name = ‘李四‘;

console.log( p1.name );
console.log( p2.name );
// 如果是访问数据, 当前对象中如果没有该数据就到构造函数的原型属性中去找
// 如果是写数据, 当对象中有该数据的时候, 就是修改值; 如果对象没有该数据, 那么就添加值
```

# 原型相关的概念

1. 关于面向对象的概念
* 类 class: 在 js 中就是构造函数
* 在传统的面向对象语言中, 使用一个叫做类的东西定义模板. 然后使用模板创建对象.
* 在构造方法中也具有类似的功能. 因此称其为类
```
// 在 java 中, 最小的代码单位是 类
class Program {
// 成员
}
```
* 实例 ( instance ) 与对象 ( object )
* 实例一般是指某一个构造函数创建出来的对象. 我们成为 xxx 构造函数的实例
* 实例就是对象. 对象是一个泛称.
* 实例与对象是一个近义词
* 键值对与属性和方法
* 在 js 中键值对的集合称为对象
* 如果值为数据( 非函数 ), 就称该键值对为属性 property
* 如果值为函数( 方法 ), 就称该键值对为方法 method
* 父类与子类
* 传统的面向对象语言中使用类来实现继承. 那么就有父类, 子类的概念
* 父类又称为基类, 子类又称为派生类
* 在 js 中常常称为父对象, 子对象. 基对象, 派生对象.
2. 原型相关的概念
* 神秘对象针对构造函数称为 "原型属性"
* 神秘对象就是构造函数的原型属性
* 简称原型
* 神秘对象与构造函数所创建出来的对象也有一定关系
* 关系是什么
* 神秘对象针对构造函数创建出来的对象称为 "原型对象"
* 简称原型
* 对象继承自其原型
* 构造函数创建的对象 继承自 构造函数的原型属性
* 构造函数创建的对象 继承自 该对象的原型对象
* 构造函数所创建出来的对象与构造函数的原型属性表示的对象是两个不同的对象
* 原型中的成员, 可以直接被实例对象所使用
* 也就是说实例对象直接 "含有" 原型中的成员
* 因此 实例对象 继承自 原型
* 这样的继承就是 "原型继承"
3. 一些问题
* {} 构造函数是什么?
* 凡是字面量的对象都有构造函数
* {} Object
* [] Array
* /./ RegExp
* function ... Function

# 如何使用原型

为什么使用原型?

1. 利用对象的动态特性
* 构造函数.prototype.XXX = vvvv;
2. 利用直接替换
```
Student.prototype = {
sayHello: function () {},
study: function () {}
};
```

时间: 2024-10-09 14:50:22

面向对象day03的相关文章

Java学习二(面向对象)day03

day03 1.引用类型数组 1)先声明后赋值 Student[] stus = new Studenr[3]; stus[0] = new Student("zhangsan",25,"LF"); stus[1] = new Student("lisi",26,"JMS"); stus[2] = new Student("wangwu",27,"SD"); stus[1].age =

Java Day03 面向对象程序设计

1.面向对象 面向对象是指一种程序设计泛型,同时也是一种程序开发的方法. 2.类 类是一种抽象的概念,类中包含了数据与对数据的操纵. 具有相同特性(数据元素)和行为(功能)的对象的抽象就是类.类是对象的抽象,对象是类的具体化,也可以说类的实例是对象,类实际上就是一种数据类型. 类包含两部分: 数据,数据在类中称为属性 例如人就是一种抽象的概念,人具有姓名.性别.身高等属性,还有吃饭.跑步等操纵属性的方法. 3.对象 对象是一种具体的概念,是类的一种具体的表示方法.比如人是一个类,张三.王五等具体

2Python全栈之路系列之面向对象进阶及类成员

Python全栈之路系列之面向对象进阶及类成员 再次了解多继承 先来一段代码 #!/usr/bin/env python # _*_ coding:utf-8 _*_ class A:     def bar(self):         print("BAR")         self.f1()          class B(A):     def f1(self):         print("B")          class C:     def 

Java之面向对象详细总结

学习面向对象已经整整一周了,面向对象的三大特性继承.封装.多态的基本概念及应用场景,案例示例都已详细学习了,几天称着周末和刚讲完,在此对Java中比较抽象的面向对象做个小的总结,加强一下记忆与理解: 1.面向对象三大特征: 1)封装: 1.1)类:封装的对象的数据和行为 1.2)方法:封装的是具体的业务实现细节 1.3)访问控制修饰符:封装的是访问的权限--保护数据 2)继承: 2.1)目的:代码的重用 2.2)父类:共有的  子类:特有的 继承后子类具有:父类的和子类的 2.3)单一继承,传递

Python面向对象进阶及类成员

再次了解多继承 先来一段代码 #!/usr/bin/env python # _*_ coding:utf-8 _*_ class A:    def bar(self):        print("BAR")        self.f1() class B(A):    def f1(self):        print("B") class C:    def f1(self):        print("C") class D(C,

python学习 面向对象封装

from collectoins import namedtuplePoint=namedtuple('point',['x','y'])t1=Point(1,2)print(t1.x)print(t1.y)没有方法的类属性不会发生变化    定义简单 不能改变面向对象封装私有属性!!!私有方法!!!用装饰器描述的几个方法@property !!!@classmethod!!@staticmethod! 封装:class Teacher:     def __init__(self,name,p

python—面向对象的封装

封装 私有属性 class Teacher: __identifier = 'Teacher' #私有静态属性 def __init__(self,name,pwd) self.name = name self.__pwd = pwd #私有属性 内部使用,外部不能使用 def pwd(self): print(self.__pwd) alex = Teacher('alex','3714') alex.pwd() class Teacher: __identifier = 'Teacher'

python学习_day26_面向对象之封装

1.私有属性 (1)动态属性 在python中用双下划线开头的方式将属性隐藏起来.类中所有双下划线开头的名称,如__x都会自动变形成:_类名__x的形式.这种自动变形的特点是: a.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果.b.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的.c.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆

python面向对象知识点疏理

面向对象技术简介 类: 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例.class 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且在函数体之外.类变量通常不作为实例变量使用. 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据. 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖,也称为方法的重写. 实例变量:定义在方法中的变量,只作用于当前实例的类. 继承:即一个派生类(de