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

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

培(信仰)
培(信仰)原创
2021年01月15日 23:18:42732浏览

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,似乎也很可爱。继续找寻它的可爱之处。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议