【JavaScript高级程序设计】读书笔记-第4章function

函数内部属性 :arguments、callee、caller、prototype 以及方法call和apply等。

arguments:arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:

arguments[0]
arguments[1]
arguments[2]

arguments.callee:
指向当前执行的函数。

在这里插入图片描述

arguments.caller :
指向调用当前函数的函数。

在这里插入图片描述
在这里插入图片描述

arguments.length:
指向传递给当前函数的参数数量。

arguments[@@iterator]:
返回一个新的Array迭代器对象,该对象包含参数中每个索引的值。

每个函数都包含两个非继承的方法call()和apply()

apply() 改变函数内部this的指向
methodName.apply(obj,args) 第一个参数是函数作用域(相当于调用者),第二个是参数数组。 这里相当于java的反射调用 method.invoke(obj,args)

改变了this的指向

在这里插入图片描述

call()

call() 与apply()类似,只是传参方式不同,call需要传多个参数,apply只需要传一个参数数组
在这里插入图片描述

prototype

  1. 函数有一个prototype (原型对象), 它是用来规范【所有】 通过 【new+ 函数】创建【实例的 共享属性/方法】。
    prototype 能让【实例】有"共享"的属性和方法。 就像是对构造函数的补充。我将它看作在function中追加了 this.xx = something.
    ps:对应原型对象的属性是基本属性,共享无所谓。但是,对于引用类型属性,修改其会导致所有实例的该属性都变更。见10.
    在这里插入图片描述

在这里插入图片描述

  1. 先声明实例 再用prototype定义 实例的共享属性和方法 , 之前的实例一样能使用
    在这里插入图片描述

  2. 与prototype不同的是, Object.defineProperty只能修改一个对象的属性和方法。 而prototype是所有对象的属性和方法(从p和p2看出)

在这里插入图片描述

  1. Person.prototype.isPrototype§ 可以用于判断p的__proto__属性是否指向prototype

在这里插入图片描述

  1. 也可以通过Object.getPrototypeOf§得到p的__proto__属性
    在这里插入图片描述

  2. 实例中的同名方法/属性 会屏蔽 prototype中的方法和属性。当执行p.sayHi()时,会先从p中找是否有sayHi方法,没有则从p.__proto__中找Person.prototype对应的sayHi方法。可以通过delete 删除原型中的方法后 恢复对原型方法的访问。
    在这里插入图片描述

  3. 通过p.hasOwnProperty(“name”)可以判断name属性来自原型还是实例。
    在这里插入图片描述

  4. 通过 hasOwnProperty和in 判断是否是原型的属性
    在这里插入图片描述

  5. 更简单的原型语法
    在这里插入图片描述

  6. 原型对象的问题
    当原型对象是引用类型的时候,改变会导致所有实例的该属性改变。
    在这里插入图片描述

posted @ 2019-03-23 16:53  thewindkee  阅读(95)  评论(0编辑  收藏  举报