0%

JavaScript对象与函数对象

函数对象与其他对象的区别

JavaScript中的函数和其他对象最大的区别在于它们有一个特殊的内部属性[[Call]],包含了该函数的执行指令。typeof操作符会在对象内查找这个内部属性,若找到则返回”function”

call() apply() bind() 三者的区别

第一个参数都是传给新函数this的值,call()和apply()的区别仅传人参数形式不同,call()第二个参数起接收参数列表,而apply()第二个参数接收数组或类数组。而bind()跟call()一样,不同的是第二个参数起会被永久设置在新函数中的形参。

JavaScript对象定义属性

当一个属性第一次被添加对象时,JavaScript在对象上调用一个名为[[Put]]的内部方法。[[Put]]方法会在对象上创建一个新节点来保存属性,这个操作不仅指定了初始的值,也定义了属性上的一些特征。
当一个已有属性被赋予新值时,调用的是[[Set]]方法。
delete操作符会对单个对象属性调用名为[[Delete]]内部方法。delete仅对自有属性有效。

查找对象属性

in操作符会检查自有属性和原型属性
hasOwnProperty()只检查自有属性

属性枚举

for-in循环返回的和Object.keys()返回的可枚举属性的区别:for-in循环遍历自有属性和原型属性,而Object.keys()只返回自有属性名字的数组。

属性通用特征

数据和访问器属性都具有[[Enumerable]]和[[Configurable]](布尔值)。如果想改变属性特征,可以使用Object.defineProperty(obj,proName,descript),当调用这个方法时,应该要指定descript所有值,否则布尔类型的值都是false。
定义多重属性可以用Object.defineProperties(obj,proObj)
获取属性特征可以用Object.getOwnPropertyDescriptor(obj,proName)

数据属性特征

[[Value]]所有属性的值都保存在这。
[[Writable]]是一个布尔值,指示该属性是否可以写入。

访问器属性特征

[[Get]]读取属性值 [[Set]]设置属性值;内涵getter和setter函数。

构造函数与原型对象

每个对象在创建时都自动拥有一个构造函数属性,其中包含了一个指向其构造函数的引用。那些通过字面量或者Object构造函数创建的泛用对象,其构造函数属性指向Object,而通过自定义构造函数创建的对象则指向创建它的构造函数。
当调用构造函数时,new会自动创建this对象,且其类型就是构造函数的类型。也可以在构造函数显式调用return。如果返回值是一个对象则返回该对象,否则返回新创建的对象实例。

[[Prototype]]属性

一个对象实例通过内部属性[[Prototype]]跟踪其原型对象。该属性是一个指向该实例使用的原型对象的人指针。当用new创建一个新的对象时,构造函数的原型对象会被赋给该对象[[Prototype]]属性。
avatar
当读取一个对象属性时,JavaScript引擎首先在该对象上的自有属性中查找属性名字。如果找到则返回。如果自有属性中不包含改名字,则会搜索[[Prototype]]中的对象,找到则返回,直至找到末端Object.prototype。
无法给一个对象的原型属性赋值。

对象继承

对象字面量会隐式指定Object.prototype为其[[Prototype]],当然也可以使用Object.create()方法显式指定。第一个参数是需要被设置新对象的[[Prototype]],第二个参数是属性描述对象。也可以使用它来创建一个没有原型链的对象。
var nakedObj = Object.create(null);