原型及原型链
实例对象和原型链是通过原型_ 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 _