函数中的this关键字指代调用了函数的对象,如果不通过某个对象调用函数,那么this指向全局对象。
new关键字和this关键字密切相关。new关键字创建一个空对象,然后使用指向这个对象的this调用函数,函数不会创建对象,只会修改this指向的对象,关键字new创建的对象(也就是this指向的对象)会返回给函数中的this,而被new调用的函数称为构造函数
function makePerson(first, last) { return { first: first, last: last, fullName: function() { return this.first + ' ' + this.last; }, fullNameReversed: function() { return this.last + ', ' + this.first; } } } s = makePerson("Simon", "Willison"); s.fullName(); // Simon Willison s.fullNameReversed(); // Willison, Simon s = makePerson("Simon", "Willison"); var fullName = s.fullName; fullName(); // undefined undefined,this指向全局对象,全局对象中没有定义first和last所以为undefined
//当执行
var o = new Foo()
//javascript实际是执行
var o = new Object()
o.__proto__ = Foo.prototype
Foo.call(o)
原型链
js只有一种结构是对象,每个对象都有一个私有属性(__proto__)指向其构造函数的原型对象(prototype)。该原型对象也有自己的原型对象(__proto__),
层层向上知道一个对象的原型对象是null,null没有原型对象,所以null是原型链的终点。几乎所有js对象都是位于原型链顶端Object的实例。
当访问一个对象的属性时,不仅会在当前对象上搜索,还会在原型链中搜索,知道找到名字匹配的属性,或到达原型链的末尾。
当一个对象A调用其原型对象B的方法时,方法中的this指向的是对象A。
var o = {a: 1};
// o 这个对象继承了 Object.prototype 上面的所有属性
// o 自身没有名为 hasOwnProperty 的属性
// hasOwnProperty 是 Object.prototype 的属性
// 因此 o 继承了 Object.prototype 的 hasOwnProperty
// Object.prototype 的原型为 null
// 原型链如下:
// o ---> Object.prototype ---> null
var a = ["yo", "whadup", "?"];
// 数组都继承于 Array.prototype
// (Array.prototype 中包含 indexOf, forEach 等方法)
// 原型链如下:
// a ---> Array.prototype ---> Object.prototype ---> null
function f(){
return 2;
}
// 函数都继承于 Function.prototype
// (Function.prototype 中包含 call, bind等方法)
// 原型链如下:
// f ---> Function.prototype ---> Object.prototype ---> null
在原型链中查找属性是比较耗时的,访问某个不存在的属性会遍历整个原型链。
检查对象是否有自己定义的某个属性要使用从Object.prototype中继承的hasOwnProperty()方法,hasOwnProperty是唯一一个处理属性不需要遍历原型链的方法(还有一个Object.keys())