0%

1.原型链继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function Parent () {
this.name = 'kevin';
}

Parent.prototype.getName = function () {
console.log(this.name);
}

function Child () {

}

Child.prototype = new Parent();

var child1 = new Child();

console.log(child1.getName()) // kevin
阅读全文 »

==是抽象相等运算符,而===是严格相等运算符。
==运算符是在进行必要的类型转换后,再比较。
===运算符不会进行类型转换,所以如果两个值不是相同的类型,会直接返回false。
使用==时,可能发生一些特别的事情,例如:

1
2
3
4
5
6
1 == '1'; // true
1 == [1]; // true
1 == true; // true
0 == ''; // true
0 == '0'; // true
0 == false; // true
阅读全文 »

new实例化

  • 返回一个新的对象
  • 新对象可以访问构造函数里的属性和方法
  • 新对象可以访问 prototype 上的属性和方法

初步实现

因为 new 是关键字,所以无法像 bind 函数一样直接覆盖,所以我们写一个函数,命名为 mockNew,来模拟 new 的效果。

1
2
3
4
5
6
7
8
9
10
11
12
function mockNew() {
// 需要返回的对象
var obj = new Object();
// 获取需要实例化的构造函数
// shift 会返回构造函数,修改原数组,所以 arguments 会被去除第一个参数
var Constructor = [].shift.call(arguments);
// 继承原型上的属性和方法
obj.__proto__ = Constructor.prototype;
//继承构造函数的属性和方法
Constructor.apply(obj, arguments);
return obj;
}
阅读全文 »

bind的作用

  • bind()方法返回一个新的函数,
  • 新函数的this值指向传入的第一个参数,this被绑定了
  • bind 的时候可以传递参数,进行绑定
  • bind 返回的函数作为构造函数的时候,bind 时指定的 this 值会失效,但传入的参数依然生效

返回函数的模拟实现

1
2
3
4
5
6
Function.prototype.bind = function (context) {
var that = this;
return function () {
return self.apply(context);
}
}
阅读全文 »

call的特点

  • 可以改变当前函数的this指向
  • 让当前函数执行

call模拟实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Function.prototype.call = function (context) {
var context = context ? Object(context) : window;// 兼容context,Object(context)兼容context为string的情况
context.fn = this; // 将函数设为对象的属性

var args = [];
//获取参数
for(var i = 1, len = arguments.length; i < len; i++) {
args.push('arguments[' + i + ']');
}

// 执行函数
// args 会自动调用 Array.toString() 这个方法
var result = eval('context.fn(' + args +')');
// 删除该函数
delete context.fn;
//返回结果
return result;
}
阅读全文 »