Blogger Information
Blog 32
fans 0
comment 0
visits 22173
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
js急速入库之三(构造函数与原型/类/及dom操作)
培(信仰)
Original
724 people have browsed it

js急速入库之三(构造函数与原型/类/及dom操作)

构造函数和原型

任何一个函数都有一个原型属性:prototype,该属性是一个指针,指向一个对象,该对象称之为原型对象(可以使用这个原型对象帮助我们在js中实现继承)
原型对象上默认有一个属性constructor,该属性也是一个指针,指向其相关联的构造函数。
调用构造函数实例化对象,都拥有一个内部属性,指向原型对象。其实例对象能够访问原型对象上的所有属性和方法
简言之:每个构造函数都有一个原型对象,原型对象上包含着一个指向构造函数的指针,而实例都包含着一个指向原型对象的内部指针。实例可以通过内部指针访问到原型对象,原型对象可以通过constructor找到构造函数

  1. //任何一个函数都有一个原型属性:prototype
  2. function f1() {}
  3. console.log(f1);
  4. //prototype对普通函数没用,对构造函数才有用
  5. //构造函数是"对象工厂",是用来创建对象的
  6. //对象也叫做“实例”,实例:实际案例 是具体的。
  7. //js中没有“类”的概念,他是基于原型的语言,所以可以将构造函数当成类
  8. //构造函数必须使用“new”来调用,普通函数不用
  9. //new的过程就是类的实例化过程,就是创建一个对象的过程
  10. //创建类的过程,就叫“类的实例化”
  11. // 声明一个构造函数
  12. function User(name, email) {
  13. //1. 创建出一个新对象,用this来表示(伪代码)
  14. // const this = new User;
  15. //2. 初始化对象,给这个对象添加自定义属性,用来和其他实例进行区分
  16. this.name = name;
  17. this.email = email;
  18. //3. 返回这个对象
  19. // return this;
  20. }
  21. const user = new User("admin", "admin@php.cn");
  22. console.log(user instanceof User);
  23. console.log(user);
  24. user.__proto__.salary = 8899;
  25. console.log(user.salary);
  26. const user1 = new User("tp", "tp@php.cn");
  27. console.log(user1);
  28. console.dir(User);
  29. //实例的原型永远指向他的构造函数的原型,实例的原型从构造函数的原型继承成员(属性/方法)
  30. console.dir(user1.__proto__ === User.prototype);
  31. //需要被所有的类实例共享的成员,应该写在构造函数的原型上
  32. User.prototype.nation = "CHINA";
  33. console.log(user.nation, user1.nation);
  34. //属性通常不应该共享,是区分不同对象的标志,方法更适合共享
  35. User.prototype.show = function () {
  36. return {name:this.name,email:this.email,salary:this.salary};
  37. }
  38. console.log(user.show());
  39. console.log(user1.show());

类与继承

  1. //构造函数模拟类
  2. const User = function (name, email) {
  3. this.name = name;
  4. this.email = email;
  5. };
  6. //原型方法
  7. User.prototype.show = function () {
  8. return { name: this.name, email: this.email };
  9. }
  10. const user = new User("tp", "tp@php.cn");
  11. console.log(user.show());
  12. // es6 中的类来改写
  13. class User1 {
  14. // 类的构造方法
  15. constructor(name, email) {
  16. this.name = name;
  17. this.email = email;
  18. }
  19. //原型方法,使用类实例/对象来调用
  20. show() {
  21. return { name: this.name, email: this.email,age: this.#age};
  22. }
  23. //静态方法:不需要通过对象调用,直接用类调用
  24. static fetch(){
  25. //静态方法中的this指向类
  26. // return { name: this.name, email: this.email };
  27. return this.hello(this.userName);
  28. }
  29. static userName = 'xxx';
  30. static hello(name){
  31. return 'hello '+name;
  32. }
  33. //私有成员,只能在本类中使用,类外,子类中都不能用
  34. #age = 40;
  35. //声明为私有主要是访问限制
  36. //访问器属性
  37. set age(value){
  38. if (value >= 18 && value <= 60){
  39. this.#age = value;
  40. } else {
  41. throw new Error("年龄必须在18-60之间");
  42. }
  43. }
  44. get age(){
  45. return this.#age;
  46. }
  47. }
  48. const user1 = new User1("tp", "tp@php.cn");
  49. console.log(user1.show());
  50. //静态方法用类调用比如 Array.of(),Array.form()
  51. console.log(User1.fetch());
  52. //访问私有成员
  53. console.log(user1.age);
  54. // user1.age=80;
  55. // console.log(user1.age);
  56. // 类的继承
  57. class Child extends User1 {
  58. //子类扩展父类的功能,可以拥有自己的属性或者方法
  59. // 子类中可以访问父类的构造方法,原型方法,静态方法,不能访问父类的私有成员
  60. constructor(name, email,gender) {
  61. // this.name = name;
  62. // this.email = email;
  63. // super()调用父类构造方法,确定this指向
  64. super(name,email);
  65. this.gender = gender;
  66. }
  67. show(){
  68. return { name: this.name, email: this.email ,gender:this.gender};
  69. }
  70. }
  71. const child = new Child("yy","yy@php.cn","yy_yy");
  72. console.log(child.show());
  73. // 类中成员:构造方法,原型方法,静态方法,私有方法
  74. // 继承 extends,super()

总结:js中类是构造函数的语法糖;class 中 constructor 关键字;子类 扩展 extends ,以及子类中constructor 中的super()
类中不同方法的调用:原型方法使用实例调用,静态方法使用类调用,静态方法使用static 关键字

获取dom元素

使页面动起来的必要条件,获取元素

  1. <ul id="list">
  2. <li class="item">item1</li>
  3. <li class="item">item2</li>
  4. <li class="item">item3</li>
  5. <li class="item">item4</li>
  6. <li class="item">item5</li>
  7. </ul>
  8. <img src="../1223/static/images/jddog.png" alt="">
  9. <a href="../1223/static/images/jddog.png">连接</a>
  10. <form action="">
  11. <input type="text">
  12. </form>
  13. <script>
  14. //使用css选择器是最直观的
  15. //1. 获取满足条件的所有元素
  16. const lis = document.querySelectorAll("#list li");
  17. console.log(lis);
  18. //Nodelist 是浏览器内置的集合类型,属性类数组
  19. //Array.from(),[...rest],都可以转为真正的数组
  20. let lisArr = Array.from(lis);
  21. console.log(lisArr);
  22. console.log([...lis]);
  23. // Nodelist 可以直接用forEach()遍历
  24. // lis.forEach(function (item, index, arr) {
  25. // console.log(item, index, arr);
  26. // });
  27. // 一般只写第一个参数 拿到遍历的元素
  28. // lis.forEach(function (item) {
  29. // console.log(item);
  30. // });
  31. //使用箭头函数简写
  32. // lis.forEach(item=>console.log(item));
  33. let first = document.querySelectorAll("#list li:first-of-type");
  34. console.log(first);
  35. console.log(first[0]);
  36. //2. 获取满足条件的第一个元素
  37. first = document.querySelector("#list li");
  38. console.log(first);
  39. console.log("---------------------");
  40. // 还有传统的方式
  41. // document.getElementById()
  42. // document.getElementsByTagName()
  43. // document.getElementsByName()
  44. // document.getElementsByClassName()
  45. // console.log(document.getElementById("list"));
  46. // console.log(document.getElementsByTagName("ul"));
  47. // console.log(document.getElementsByTagName("li"));
  48. // console.log(document.getElementsByClassName("item"));
  49. // 有几个快捷方式,用来快速获取某一或者某一类元素
  50. //html
  51. // console.log(document.documentElement);
  52. //head
  53. console.log(document.head);
  54. //body
  55. console.log(document.body);
  56. //title
  57. console.log(document.title);
  58. //forms
  59. console.log(document.forms);
  60. console.log(document.forms[0]);
  61. console.log(document.forms.item(0));
  62. console.log(document.images);
  63. console.log(document.anchors);
  64. </script>

总结:一招鲜吃遍天下 document.quyerySelector() 返回满足条件的第一个元素;document.quyerySelectorAll()返回满足条件的一个元素集合。可以使用Array.from()转化为数组,或者使用 …rest 语法:[...lis]。一组快捷键需要记下

  1. //html
  2. console.log(document.documentElement);
  3. //head
  4. console.log(document.head);
  5. //body
  6. console.log(document.body);
  7. //title
  8. console.log(document.title);
  9. //forms
  10. console.log(document.forms);
  11. console.log(document.forms[0]);
  12. console.log(document.forms.item(0));
  13. console.log(document.images);

dom元素的增删改查

  1. <ul id="list">
  2. <li class="item">item1</li>
  3. <li class="item">item2</li>
  4. <li class="item">item3</li>
  5. <li class="item">item4</li>
  6. <li class="item">item5</li>
  7. </ul>
  8. <script>
  9. const ul =document.querySelector("#list");
  10. //1. 创建元素
  11. const li = document.createElement("li");
  12. li.innerText='新增';
  13. //parent.appendChild(childEl),父元素里添加新的子元素
  14. ul.appendChild(li);
  15. li.innerHTML=`<li style="color:red"> item6 </li>`;
  16. let htmlStr="<li style='color:blue'>item7</li>";
  17. ul.insertAdjacentHTML("beforeend",htmlStr);
  18. // 如果大量添加元素应该使用文档片段完成
  19. // const frag = document.createdocumentfragment();
  20. const frag = new DocumentFragment;
  21. for (let i=0;i<5;i++){
  22. const li = document.createElement("li");
  23. li.textContent="item8-"+(i+1);
  24. //将生成的节点先临时挂载到文档片段中
  25. frag.appendChild(li)
  26. }
  27. ul.appendChild(frag);
  28. htmlStr = `
  29. <li style="color:violet"> demo1 </li>
  30. <li style="color:violet"> demo2 </li>
  31. <li style="color:violet"> demo3 </li>
  32. <li style="color:violet"> demo4 </li>
  33. `;
  34. ul.insertAdjacentHTML("afterbegin",htmlStr);
  35. //用元素不用字符串
  36. ul.insertAdjacentElement("afterbegin",li);
  37. ul.insertAdjacentHTML("afterbegin","<li>itme test</li>");
  38. //2.更新
  39. let h3 = document.createElement("h3");
  40. h3.innerHTML =" hello ";
  41. document.querySelector("li:nth-of-type(3)").replaceWith(h3);
  42. // console.log(document.querySelector("ul > li:last-of-type"));
  43. ul.replaceChild(h3, document.querySelector("ul > li:last-of-type"));
  44. //3.删除
  45. ul.removeChild(h3);
  46. // h3.remove();
  47. // 4. 遍历查询
  48. console.log(ul.children);
  49. //获取子元素的数量
  50. // console.log(ul.children.length);
  51. //推荐使用已下方法获取子元素数量
  52. console.log(ul.childElementCount);
  53. //获取第一个子元素
  54. console.log(ul.firstElementChild);
  55. //已下方法会取出空白节点,不推荐使用
  56. // console.log(ul.firstChild);
  57. console.log(ul.lastElementChild);
  58. //获取父节点
  59. // console.log(h3.parentElement);
  60. console.log(document.querySelector(".item").parentElement);
  61. //获取前一个兄弟
  62. console.log(document.querySelector("#list li:nth-of-type(9)").previousElementSibling.innerHTML);
  63. //获取后一个兄弟
  64. console.log(document.querySelector("#list li:nth-of-type(9)").nextElementSibling.innerHTML);
  65. </script>

总结:

  1. 插入或者新增元素都需要在父节点上调用。一种是单个插入,第二种是先插入到文档片段在整体插入
  1. //新增子元素(最下面)
  2. ul.appendChild(li);
  3. //插入子元素到指定位置
  4. ul.insertAdjacentElement("afterbegin",li);
  5. ul.insertAdjacentHTML("afterbegin","<li>itme test</li>");
  1. 更新或者替换元素

    2.1 在子元素上调用使用旧值.replaceWith(新值)

  1. document.querySelector("li:nth-of-type(3)").replaceWith(h3);
  1. 2.2 在父元素上调用使用 `父元素.replaceChild(新值,旧值)`
  1. ul.replaceChild(h3, document.querySelector("ul > li:last-of-type"));
  1. 删除

方法一:
父元素.removeChild(需要删除的子元素);
方法二:
子元素.remove();

  1. 遍历
    推荐使用
  1. console.log(ul.children);
  2. //获取子元素的数量
  3. // console.log(ul.children.length);
  4. //推荐使用已下方法获取子元素数量
  5. console.log(ul.childElementCount);
  6. //获取第一个子元素
  7. console.log(ul.firstElementChild);
  8. //已下方法会取出空白节点,不推荐使用
  9. // console.log(ul.firstChild);
  10. console.log(ul.lastElementChild);
  11. //获取父节点
  12. // console.log(h3.parentElement);
  13. console.log(document.querySelector(".item").parentElement);
  14. //获取前一个兄弟
  15. console.log(document.querySelector("#list li:nth-of-type(9)").previousElementSibling.innerHTML);
  16. //获取后一个兄弟
  17. console.log(document.querySelector("#list li:nth-of-type(9)").nextElementSibling.innerHTML);

神秘的js,似乎也很可爱。继续找寻它的可爱之处。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post