This 原型链 继承

2017-12-14  本文已影响0人  Maaaax

this相关

语法
fun.call(thisArg, arg1, arg2, ...)
call()方法调用一个函数, 其具有一个指定的this值和分别提供的参数。
可以让call()中的对象调用当前对象所拥有的function。你可以使用call()来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)。

apply()方法与call()类似,只有一个区别,就是call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组。

bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值


var john = { 
  firstName: "John" 
}
function func() { 
  alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi()       

输出john:hi!,因为john.sayHi()this指向对象john

func() 
function func() { 
  alert(this)
}

func()等同于window.func()所以this指向window

document.addEventListener('click', function(e){
    console.log(this);    // 此处this指的是绑定事件的对象,即document
    setTimeout(function(){
        console.log(this);  //setTimeout定时器中的this默认是window,所以此处this为window
    }, 200);
}, false);
var john = { 
  firstName: "John" 
}

function func() { 
  alert( this.firstName )
}
func.call(john)  //输出  john,因为call()方法将传入的john对象作为this
var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) //this指什么
      this.showMsg();
    })
  },
  
  showMsg: function(){
    console.log('饥人谷');
  }
}
//   上述代码中的this代表绑定事件的$btn元素,而$btn是没有showMsg()的,
//   修改方法:将this重新定义,使方法有效↓
var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) //this指什么
      this.showMsg();
    }.bind(this))
  },
  
  showMsg: function(){
    console.log('饥人谷');
  }
}

原型链相关

function Person(name){
    this.name = name;
}
Person.prototype.sayName = function(){
    console.log('My name is :' + this.name);
}
var p = new Person("若愚")
p.sayName();

// Person 是构造函数
// P是用Person构造函数所创建的实例
// Person.prototype是构造函数的原型对象
// Person.prototype.constructor === Person
// P.__proto__ 指向Person.prototype
// P.constructor 也指向Person构造函数
String.prototype.getMostOften = function(){
    var obj = {},max = 0, maxChar;
    for(var i = 0;i<this.length;i++){
      var char = this.charAt(i);
      if(obj[char]){
        obj[char]++;
      }else{
        obj[char] = 1;
      }
    }
    for(var key in obj){
      if(obj[key]>max){
        max = obj[key];
        maxChar = key;
      }
    }
    return maxChar;
};
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d

instanceOf 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性

使用instanceOf会沿着对象的原型链去寻找constructor属性,来判断是否指向某个构造函数,返回true OR false

继承相关

//方法1
function People(name, sex){
    this.name = name;
    this.sex = sex;
    this.printName = function(){
        console.log(this.name);
    }
}
var p1 = new People('饥人谷', 2)

//方法2
function Person(name, sex){
    this.name = name;
    this.sex = sex;
}

Person.prototype.printName = function(){
    console.log(this.name);
}
var p1 = new Person('若愚', 27);

用第一种构造函数所创建的实例所使用的printName方法是独立的,单独储存的,占用资源较大
第二种将printName方法写到prototype中,使所有创建的实例能够共享此方法,节省内存,提高性能

Object.create() 方法会使用指定的原型对象及其属性去创建一个新的对象

可用于实现原型属性、方法的继承
兼容:
chrome 5,Edge,Firefox 4,IE 9,Opera 11.6,Safari 5

作用:hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性
语法:obj.hasOwnProperty(prop)

function Person(name, sex){
    this.name = name;
    this.sex = sex;
}
function Male(name, sex, age){
    Person.call(this, name, sex);    //这里的 call 有什么作用
    this.age = age;
}

再Male构造函数中通过call()方法引入person函数,可以使用Person的属性、方法,实现了继承

function Person(name, sex){
    this.name = name;
    this.sex = sex;
}

Person.prototype.getName = function(){
      return this.name;
};    
Person.prototype.printName = function(){
      console.log(this.name);
}; 
function Male(name, sex, age){
    this.age = age;
    Person.call(this,name, sex)
}

Male.prototype = Object.create(Person.prototype)
Male.prototype.constructor = Male
 
Male.prototype.getAge = function(){
    console.log(this.age);
};

var ruoyu = new Male('若愚', '男', 27);
ruoyu.printName();
上一篇下一篇

猜你喜欢

热点阅读