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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值