JS的继承是基于原型的继承

  1. 作用:可以在一个类上定义一个对象,那么实例化的对象就自动拥有了这个方法
  1. /* 原型
  2. 1.obj.__proto__ 找到它的原型对象
  3. 2.数组上的方法都是挂载在原型上(Array.prototype)的
  4. */
  5. // toString() 因为数组的原型上有字符串toString()
  6. // push,unshift() 因为数组原型上有
  7. var arr = [1,2,3]
  8. console.log(Array.prototype);
  9. console.log(arr.__proto__);
  10. console.log(arr.__proto__ == Array.prototype);
  11. // Object.getPrototypeOf() 也可以访问原型对象
  12. /*
  13. var object = {};
  14. var prototype = Object.getPrototypeOf(object);
  15. console.log(prototype === Object.prototype); // true
  16. */

修改原型

  1. <!-- 原型 -- 为了继承而诞生 -->
  2. <script>
  3. Array.prototype.push = function(){
  4. console.log("push");
  5. }
  6. var arr = [];
  7. arr.push();
  8. </script>

添加原型

  1. <!-- 作用:可以在一个类上定义一个对象,那么实例化的对象就自动拥有了这个方法 -->
  2. <script>
  3. var arr = [1,2,3];
  4. Array.prototype.sum = function (arr) {
  5. let total = 0;
  6. for (let i = 0; i < arr.length; i++) {
  7. total += arr[i]
  8. }
  9. return total;
  10. }
  11. console.log(arr.sum(arr));
  12. </script>

构造函数原型

  1. <script>
  2. // es6之前没有类
  3. // 构造函数
  4. //Person
  5. //自有属性 name age
  6. //共有方法 原型上定义 sayName,之后使用new关键字新建的实例都有这个方法
  7. function Person(name,age){
  8. this.name = name;
  9. this.age = age;
  10. }
  11. Person.prototype.sayName = function(){
  12. console.log(this.name);
  13. }
  14. Person.prototype.sayAge = function(){
  15. console.log(this.age);
  16. }
  17. Person.prototype.skill = "vue"
  18. var p = new Person("李四",10);
  19. p.sayName()
  20. p.sayAge()
  21. console.log(p.skill);
  22. // hasOwnProperty 判断一个属性是否为自有属性
  23. console.log(p.hasOwnProperty("name"));//true
  24. console.log(p.hasOwnProperty("skill"));//false
  25. //构造函数的特点
  26. //1、构造函数的首字母大写
  27. //2、在函数内部可以通过this关键字,给其添加自有属性
  28. //3、可以通过new关键字实例化一个对象
  29. </script>

原型的作用

  1. # 原型对象:是某一类对象的基类,所有创建的对象都会共享该原型对象 (共享机制)
  2. # 作用:将对象通用的方法挂载在原型上
  1. var arr = [1,2,3]
  2. Array.prototype.sum = function(params){
  3. if(Array.isArray(params)){
  4. return params.reduce((a,b)=>a+b)
  5. }
  6. }
  7. console.log(arr.sum(arr));
  8. Array.prototype.http = function(){
  9. console.log("http");
  10. }
  11. arr.http()

4 原型 - 图1

  1. function Teacher(name,age){
  2. this.name = name
  3. this.age = age
  4. }
  5. /* sayName */
  6. Teacher.prototype.sayName = function(){
  7. console.log(this.name);
  8. }
  9. var p = new Teacher("lisi",30)
  10. console.log(p);

2-2-1 判断一个对象是否是另一个对象的原型对象

  1. isPrototypeOf() 判断一个对象是否是另一个对象的原型对象
  2. var object = {};
  3. console.log(Object.prototype.isPrototypeOf(object)); // true