JavaScript--对象--方法、this关键字和prototype

对象的方法

方法是一个汉语词汇,一般是指为获得某种东西或达到某种目的而采取的手段与行为方式。

在对象中,若键值对的值是一个函数,那么这个键值对就是该对象的方法。

var obj = {
       value: function () { console.log("hello") }
      }

调用该方法:

obj.value()

this关键字

this关键字是一个难点,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。

    function fn(){
     
      this.a = 1;
     
    }

在运用this关键字时,我们需要注意它的指向。

  1.  如果单独使用,this 表示全局对象。
  2. 在方法中,this 表示该方法所属的对象。
  3.  在函数中,this 表示全局对象。
  4. 在构造函数中,this指向创造出来的实例

且this指向的永远只可能是对象,这并不会取决于this写在哪,而是取决于函数在哪调用

this的劫持

call

我们知道函数是一个特殊的对象 因此函数也有一些官网提供的属性和方法,length属性就是函数的形参,而call方法则是调用函数并指定函数内部的this指向

var obj1={
     age:17,
     value:function(){
        console.log(this.age)
     }
 }
var obj2={
     age:22
 }

obj1.value.call(obj2)

使用call时,第一个参数指定了函数内部的this指向,后面的参数为传入的实参,用逗号分隔。

apply

apply的用法与call大致相同,唯一不同的地方在于传入参数时需要用数组:

var obj1={
     value:function(a,b){
        console.log(a+b)
     }
 }
var obj2={
     
 }

obj1.value.apply(obj2,[3,4])
bind

使用bind更改this的指向后,调用该this所在的函数时,this只会指向bind指定的指向

var obj1={
     age:25,
     value:function(){
        console.log(this.age)
     }.bind(obj2)
 }
var obj2={
     age:18
 }

obj1.value()
var obj1={
     age:25,
     value:function(){
        console.log(this.age)
     }
 }
var obj2={
     age:18
 }

var re=obj1.value.bind(obj2)
re()

当函数是声明式的写法时,不能直接调用bind函数

new关键字

使用new关键字,我们可以创建一个对象

 var obj = new Object()
 obj.name = "Aric"
 obj.age  = 21

你是否会认为创建对象应该这样写

var obj  = {
    name : "Aric",
    age  : 21
}

事实上,上图使用的是语法糖 ,第一种方法中,Object是官方提供的一个函数。然后我们继续向下走:

function fn() {
    this.name="mary
    this.age=20
    }

var fer = new fn()
console.log(fer)

你发现了什么?

我们用new通过函数创建了一个对象,这个函数就叫构造函数。通过这种方法,系统的执行顺序为:

  • 创建一个对象
  • 运行函数

需注意函数内部的this指向的是创建的那个对象。

prototype

在函数中,除了length属性 ,还有一个prototype属性,它保存了一个内置对象。

function fn() {
    this.name="mary
    this.age=20
    }

var fer = new fn()

在上图的过程中,系统先创建一个空对象,再给这个空对象添加一个属性 __proto__,这属性保存了一个对象,这个对象就是构造函数的prototype属性中保存的那个对象,然后,调用函数,里面的this指向创建的对象,最后,表达式生成结果。

简短地说,函数有一个 prototype保存了一个对象,我们使用new函数创建对象时,创建的对象的原型对象就是它。

function fn() {
     this.a = 20
 }
fn.prototype.b = 18

var f1 = new fn()
console.log(f1.b)

让我们再创建一个对象f2

var f1 = new fn()

此时f1和f2的prototype是同一个,即

console.log(f1.__proto__ === f2.__proto__)//true

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值