<script>
// let a = {
// name : "懒羊羊",
// fn : function(){
// console.log(this.name);
// }
// }
// let b = a.fn;
// b.fn(); 为空
// call、apply的作用
// 1、执行函数;2、改变this指向 3、可以传参数
//call 传参:第一个参数是this的指向,
//后面的参数都是 对应b函数的形参
// let a = {
// name : "懒羊羊",
// fn : function(){
// console.log(this.name);
// }
// }
// let b = a.fn;
// b.apply(a,["美美的","美羊羊"]);
// let a1 = {
// name : "fei羊羊",
// fn : function(){
// console.log(this.name);
// }
// }
// let b1 = a1.fn;
// b1.apply(a1,["美美的","美羊羊"]);
//3、bind
//作用:可以改变this指向,2、可以传入参数,3、不可以执行函数,返回一个新函数
let a = {
name : "懒羊羊",
fn : function(adj, person){
console.log(this.name + adj + person);
}
}
let b = a.fn;
// b.bind(a,["美美的","美羊羊"]); //什么也没有
let c = b.bind(a ,"美美的","美羊羊");
// b.bind(a,"美美的","美羊羊")();
// b.bind(a,"美美的")("美羊羊");
// b.bind(a)("美美的","美羊羊"); //可以减少一下重复参数
//方式一、二、三
c();
//区别:call和apply立马执行函数 bind不能执行函数,返回一个新函数
//相同:都能改变this指向 都可以传参数
//写一个源码 new的实现
// function Beatifulsheep(){
// this.name = name,
// this.age = age,
// this.sec = sex
// }
// Beatifulsheep.prototype.sing = function(){
// console.log(this.name + "说,我会唱歌");
// }
// Beatifulsheep.prototype.cook = function(){
// console.log(this.name + "说,我会做饭");
// }
// let myy = new Beatifulsheep("美羊羊","22","女");
// myy.sing();
// myy.cook();
//new的作用
// 1、生成一个实例对象 (并且把函数内部的thia 指向实例对象)
//2、运行改构造函数 初始化里面的属性赋值
//3、把实例对象的原型链指向构造函数的原型对象
//1、可以访问构造函数的属性
//2、可以访问原型上的属性
//1、可以访问构造函数的属性
// function Person(){
// this.name = ["1",["2"]];
// }
// function child(){
// Person.call(this);
// }
// let c = new child();
// c.name.push("111");
// console.log(c.name);
//2、可以访问原型上的属性
// function Person(){
// this.name = ["1",["2"]];
// }
// function child(){
// Person.call(this);
// }
// let cc = new child();
// cc.protety = Person.protety;
</script>