JavaScript的元项链和new this关键字

函数中的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())
原文地址:https://www.cnblogs.com/ssw-men/p/10862277.html