什么是对象(广义上其他语言中的对象)?
- 对象是单个实物的抽象
- 对象是一个容器,封装了属性(property)和方法(method)
构造函数有什么特点?
- 函数体内部使用了this关键字,代表了所要生成的对象实例。
- 生成对象的时候,必须使用new命令。
new命令的原理是什么?
- 创建一个空对象
- 将这个空对象的原型指向构造函数的prototype属性
- 绑定this指向,即指向这个空对象
- 开始执行构造函数内部的代码
手动实现一个new:
function newObject () {
var obj = new Object() // 从Object.prototype上克隆一个空对象
obj.__proto__ = Constructor.prototype // 指向构造器的prototype
var Constructor = [].shift.call(arguments)
var ret = Constructor.apply(obj, arguments)
return typeof ret === 'object' ? ret : obj
}
如果忘了使用new命令,直接调用构造函数会发生什么事?
- 这个构造函数就变成了普通函数,并不会生成实例对象
- this这时代表全局对象
构造函数内部return语句有什么注意点?
- 有return语句时,如果后面跟的是对象,则返回这个指定的新对象;否则,就会不管return语句,返回this对象
Object.create(null)和new object()和{}的区别?
- 这三个都是创建空对象的方法
- Object.create(null)创建的是一个干净的空对象,在该对象上没有继承 Object.prototype 原型链上的属性或者方法,例如:toString(), hasOwnProperty()等方法
- 通过{}创建的对象和new Object()的方式是一样的,都会继承Object对象的所有属性,new创建出的空对象会绑定Object的prototype原型对象
- 使用for…in循环的时候会遍历对象原型链上的属性,使用create(null)生成的空对象不会再被检查属性
什么情况下使用Object.create()来生成对象?
- 当你需要一个非常干净且高度可定制的对象当做数据字典的时候
- 需要自己定义hasOwnProperty、toString方法的时候
Object.create()生成对象的原理是是什么?
- 内部定义一个构造函数
- 将参数绑定到这个构造函数的Prototype,
- 返回这个构造函数的实例对象
内部实现的代码原理如下:
function create(o){
function F(){}
F.prototype = o;
return new F();
}
this的指向?
在 ES5 中,其实 this 的指向,始终坚持一个原理: this 永远指向最后调用它的那个对象
this的指向常见于以下几种绑定方式:
- 默认绑定 (函数调用), 指向全局
- 隐式绑定 (方法调用), 当函数引用有上下文对象时,this指向这个上下文对象
- 显式绑定 (简介调用), 通过call()或者apply()绑定的this
- new绑定 (构造函数调用), 指向new出来的这个对象
- 箭头函数绑定, 箭头函数本身没有this,绑定的是最近一层非箭头函数的 this
改变this的几个方法,call、apply、bind有什么异同?
- call方法的第一个参数就是this所要指向的那个对象,如果参数为空、null和undefined,则默认传入全局对象;可以接受多个参数。
- apply方法的作用与call方法类似,但是第二个参数为数组
- bind方法用于将函数体内的this绑定到某个对象,然后返回一个新函数;bind与apply和call的区别就是bind不会被立即调用,它返回的是一个函数
apply() 有哪些应用场景?
- 找出数组最大元素
Math.max.apply(null, array)
- 将数组的空元素变为undefined
Array.apply(null, ['a', ,'b']) // [ 'a', undefined, 'b' ]
- 转换类数组的对象
Array.prototype.slice.apply({0: 1, length: 2}) // [1, undefined]