1121-js-笔记

原型链
原型的指向是否可以改变
继承如何实现继承
原型的方式继承
借用构造函数继承
组合继承
拷贝继承

函数的不同表现方式
函数调用的不同的方式

this的指向
函数也是对象
数组中的函数如何使用**重点**
原型链、不同的继承、原型的另一个作用、this指向要知道到底是谁
//使用对象
//构造函数 做了四件事:1.在内存中申请一块空间 2.把this作为当前实例对象 3.为属性和方法进行赋值 4.为对象做一个返回

function Person(name,age){
    //属性
    this.name=name;
    this.age=age;
    this.sayHi=function(){
        console.log("hello world!");
    };
}
People.prototype.sex="man";

var per=new Person("xiao ming",20);
per.sayHi();
per.sayHii();
//为了共享数据,节省内存空间,是可以把属性和方法通过原型的方式进行赋值
Person.prototype.sayHii=function(){
    console.log("hello world");
}


//实例对象中的__proto__原型指向的是构造函数中的原型prototype
console.log(per.__proto__==Person.prototype);
//实例对象中的__proto__是原型,浏览器使用
//构造函数中的prototype是原型,程序员使用

//原型链:是一种关系,实例对象和原型之间的关系

原型指向可以改变:
//构造函数中的this就是实例对象
//原型对象中方法的this就是实例对象
//实例对象和原型对象之前的关系是通过__proto__原型来联系起来的,这个关系就是原型链

原型最终指向的是哪里?
//per 实例对象的__proto__原型指向的是-------->Person.prototype的__proto__-------->Object.prototype.__proto__是null

原型指向改变如何添加方法: 如果原型指向改变了,在改变之后添加原型方法
 
实例对象和原型对象属性重名的问题?
实例对象访问这个属性,应该先从实例对象中找,找到了直接用,找不到就去指向的原型对象中找,找到就是用,
用过实例对象能否改变原型对象中的属性值? 不能 直接通过.prototype 改变

一个神奇的原型链:(实例对象和原型对象之间的关系,通过__proto__来联系)

继承:
面向对象的编程思想:需求--分析对象--特征、行为--构造函数创建对象,通过对象调用属性和方法来实现相应功能及需求

面向对象的特性:封装、继承、多态
封装:
1.一个值存储在一个变量中
2.一坨重复的代码放在一个函数中
3.一系列属性放在一个对象中
4.一些功能类似的函数(方法)放在一个对象中
5.好多类似的对象放在一个js文件中

继承:是一种关系,类与类之间的关系,js中通过构造函数模拟类,然后通过原型实现继承
     继承也是为了实现数据共享,js中的继承也是为了实现数据的共享
     作用1:数据共享,节省内存空间
     作用2:为了实现继承

多态:一个对象有不同的行为,或者是同一个行为的不同对象,产生不同的结果---------------------2019年11月21日18:50:42 start --------------------------
继承案例:
//动物有姓名、性别、年龄、习性
//二哈有独特的性质

function Animal(name,sex,age){
    this.name=name;
    this.sex=sex;
    this.age=age;
}
Animal.prototype.eat=function(){
    console.log("eat eat eat!");
}

function Dog(color){
    this.color=color;
}

Dog.prototype=new Animal("哮天犬","50kg");
Dog.prototype.bitePerson=function(){
    console.log("bite bite bite");
};
console.log(Dog.name);
Dog.bitePerson();

借用构造函数:构造函数的名字.call(当前对象)

function Person(name,age,sex,weight){
    this.name=name;
    this.age=age;
    this.sxe=sex;
    sex.weight=weight;
}
Person.prototype.sayHi=function(){
    console.log("ni hao");
};
function Student(name,age,sex,weight,score){
    //借用构造函数
    Person.call(this,name,sex,age,weight);    //解决数据共享相同的问题
    this.score=score;
}

----原型实现继承  借用构造函数实现继承
组合继承:原型实现继承 + 借用构造函数实现继承
 

function Person(name,age,sex,weight){
    this.name=name;
    this.age=age;
    this.sxe=sex;
    sex.weight=weight;
}
Person.prototype.sayHi=function(){
    console.log("ni hao");
};
function Student(name,age,sex,weight,score){
    //借用构造函数
    Person.call(this,name,sex,age,weight);    //解决数据共享相同的问题
    this.score=score;
}
Student.prototype=new Person();//不传值
Student.prototype.eat=function(){
    console.log("chi dong xi");
}
var stu=new Student("xiao ming",20,"man","100fen");
stu.sayHi();
stu.eat();

拷贝继承:把一个对象中的属性或者方法直接复制到另一个对象中
 

var obj1={
    name:"xiaoming";
    age:20;
    sleep:function(){
        console.log("sleep");
    }
};
//1:种写法
var obj2=obj1;  //改变了地址的指向
console.log(obj2.name,obj2.age);
obj2.sleep();
//2:种写法
var boj2={};
for(key in obj1){
    obj2[key]=obj1[key];
}
function Person(){}
Person.prototype.name="xiaoming";
Person.prototype.age=20;
Person.prototype.sex="man";
Person.prototype.eat=function(){
    console.log("afafafaf");
};
var per={};
for(key in Person.prototype){
    per[key]=Person.prototype[key];
}

函数的角色:
1.函数的声明
2.函数的表达式

//函数声明如果在if-else 的语句中,IE8浏览器会出现问题
//以后宁愿用函数表达式,不用函数声明

var ff;
if(true){
    ff=function(){
        console.log("sssss");
    };
}else{
    ff.function(){
        console.log("gggggg");
    };
}
ff();

函数中的this和严格模式::
普通函数中的this是?  window
function f1(){
    console.log(this);
}
window.f1();//this   //window
对象.方法中的this是?  //当前实例对象
定时器方法中的this是?  //window
构造函数中的this 是?   //实例对象
原型对象中的this是?   //实例对象

严格模式:"use strict"
函数的不同调用方式:
普通函数:
function f1(){
    console.log("qwr");
}
f1();
构造函数:
function F1(){
    console.log("qwe");
}
var f=new F1();
对象的方法:
function Person(){
    this.play=function(){
        console.log("play");
    };
}
var per==new Person()
per.play();

函数也是对象(对象不一定是函数):Math中有__proto__,没有prototype(有prototype的是函数)
所有的函数实际上都是Function的构造函数创建出来的实例对象
数组中的函数调用:
 

var arr=[
    function(){
        console.log("八一假期快乐");
    },
    function(){
        console.log("九一假期快乐");
    },
    function(){
        console.log("十一假期快乐");
    },
    function(){
        console.log("十二假期快乐");
    }
]
arr.ForEach(function(ele){
    ele();});

正则表达式:
1.元字符
2. .表示任意一个除了\n以外的字符
3.[] [0-9] 0到9之间一个数字 [a-zA-Z] 表示任意一个大小写字母
4.
5.
6.{n}表示该限定符前面的表达式出现了n次{1,6}出现1次到6次
    *表示出现0次到多次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值