three js高级 原型继承 拷贝继承构造函数继承

原型及原型链

实例对象和原型链是通过原型_ proto __原型进行联系

和构造函数之间没有直接关系

原型指向可以改变

构造函数中的this就是实例对象

原型对象中的方法中this就是实例对象

改变的比如 Student.prototype = new Person(10);

因为 new Person(10)中有一个_proto _中有一个原型指向自己的prototype

当上面把 new Person(10)赋给了Student的原型的话 Student的原型就变成了Person的原型

这时Student就可以调用它的方法 本来的原型里面的东西就不可以使用了

原型指向改变 及原型链

实例对象和原型对象之间的关系时通过_ proto_ 原型进行联系起来的,这个关系就是原型链

原型链的最终指向

对象有 __ proto__

所以原型对象 prototype这个对象也有__ proto _ 这个的指向时object

原型的指向改变了 如何添加方法

在改变之后 进行添加就可以了 在改变之前添加的方法 都不存在了

Person.prototype = {
      eat: function () {
        console.log("吃");
      }
  };

字面量的方式 因为这边{}时一个对象 对象的指向改变了

这种方式写的话 原型的指向就改变了 相当于改变了原来的原型

实例对象和原型对象属性重名问题

先从实例对象查找值 找不到 则 在从原型中查找

console.log(per.fdsfdsfsdfds);

js时一门动态类型的语言 ,兑现更没有这个属性,只要点了,那么对象就有这个东西了,没有这个属性,只要对象,属性名字,对象就有这个属性了,但是该属性没有赋值 就是undefined

一个很神奇的原型链

通过原型实现继承

面向对象的特性:封装,继承,多态

多态: 一个对象有不同的行为,或者同一个行为针对不同的对象,产生不同的结果,要想多态,就要先继承,js可以模拟多态,但是不会去使用,也不会模拟

构造函数模拟类的概念

继承: 首先继承时一种关系,类与类之间的关系,js中没有类,但是可以通过构造函数模拟类,然后通过原型来实现继承。

继承 让子级的原型指向发生改变

然后在写入一些新的东西就好了 将实例化对象赋给 子级

原型实现继承

Student.prototype = new Person("小明", 20, "男");

继承案例

构造函数继承的问题

构造函数实现的继承 导致 多次继承 前面的属性值无法改变 这是一个大的问题

继承给多个对象的时候 出现属性值是一样的

改变原型指向 直接初始化了属性 改变属性值 只能重新调用属性进行赋值

解决的方案 借用构造函数

继承的时候,不用改变原型的指向,直接调用父级的构造函数的方式来为属性赋值就可以了 —

借用构造函数 把要继承的父级构造函数拿过来就可以了

function Student(name,age,sex,weight,score) {
      //借用构造函数
      Person.call(this,name,age,sex,weight);
      this.score = score;
  }
  上面的call中的this指向是 Student对象的属性  
  就可以改变属性
  这种方法导致父级中的方法不能继承

借用构造函数 : 构造函数名字.call(当前对像(this),属性,属性,属性)

组合继承 解决借用构造函数导致父级的方法不能继承

借用构造函数解决 属性值重复问题

改变原型指向

Student.prototype=new Person();//不传值

这是就可以继承父级的方法了

拷贝继承 浅拷贝

把一个对象中的属性或者方法直接复制到另一个对象中

var obj1 = obj2;

var obj1 = {
        name: "ll",
        age: 20,
        eat: function() {
            console.log("哈哈");
        }
    }
    var obj2 = {};
    for (var key in obj1) {

        obj2[key] = obj1[key];
    }
    console.log(obj2.name);
这种方式的拷贝继承  要把var obj2 = {}放在外面

通过原型进行拷贝继承

function Person() {

    }
    Person.prototype.name = "JJS";
    Person.prototype.age = 10;
    Person.prototype.eat = function() {
        console.log("hahah1");
    }
    var obj = {};
    for (var key in Person.prototype) {
        obj[key] = Person.prototype[key];
    }
    console.dir(obj);

继承

逆推继承看原型

函数角色

函数的声明

function f1 (){
    console.log("我是函数");
}

函数表达式

var ff =function (){
    console.log("我也是一个函数")
}

两者之间的区别

函数声明如果放在if-else的语句里面,在IE8的浏览器中会出现问题

以后宁愿使用函数表达式 都不用函数声明 在谷歌和火狐 ie8都支持;

函数中的this和严格模式

函数中的this

函数中this 的指向

普通函数的this是谁 window

对象.方法中的this是谁 当前的对象

定时器方法中的this是谁 window

构造函数的this是谁 实例对象

原型对象方法中的this是谁 实例对象

在案例里面有详情

严格模式

“use strict”

严格模式下调用函数 window不能调用

函数的不同调用方式

function Person() {
        this.play = function() {
            console.log("玩耍");
        }
    }
    var per = new Person();
    per.play()

对象的方式的该函数调用 先 new 在 点属性或者方法调用

函数也是对象

对象 有 __proto _ 函数有protoytype

对象不一定是函数

所有的函数实际上都是Function的构造函数创建出来的实例对象

数组中的函数调用

数组循环 forEach方法使用一下

arr.forEach(function(ele) {
        ele();
 });
 循环输出数组里面的函数

函数有prototype 对象有 __proto _

猜你喜欢

转载自blog.csdn.net/qq_38964133/article/details/88377549
今日推荐