javascript学习笔记

1.通过Array.prototype.slice.call(fakearray)将伪数组转化为数组

(也可以通过调用[].slice.call(fakearray)将伪数组转化成真正的数组,但是标题中的方法是通过原型调用,效率非常高,推荐)

原生JS种的常见的伪数组类型有:arguements,调用getElementsByTagName产生的HTMLCollection,document.childNodes,Element类型中的attributes属性中包含的NamedNodeMap类似于Nodelist伪数组对象。

1
2
3
4
5
6
7
var fakeArray01 = {a:'a',b:'b',length:2};//没有length下标对应的值
var arr01 = Array.prototype.slice.call(fakeArray01);
alert(arr01[0]);//undefined
         
var fakeArray02 = {0:'a',1:'b',length:'num'};//length不是数值
var arr02 = Array.prototype.slice.call(fakeArray02);
alert(arr02[1]);//undefined

即使伪数组被转化成了真正的数组,但是数组中的值都是undeifined.

2.原型式继承的原理

prototype与[[ptototype]]的理解:

每一个函数都有一个显式的prototype,代表了对象的原型(构造函数所创建出来的对象的原型)。

每个对象都有一个叫做[[prototype]]的内部属性,指向于它所对应的原型对象。

prototype 的根是Object.prototype,Object.prototype 的[[prototype]]的值是NULL;

3.为什么说undefined是null的子类

因为基本数据类型可以说是引用数据类型的子类(只不过是为了提高存取的效率,存放的位置不同),对应的undefined代表了无值的基本呢数据类型,

对应的null代表了无值的引用数据类型,再根据第一句话,可以牵强的推出undefinde是继承自null?

 4.函数对象在创建的过程中都会发生些什么?

函数对象详细创建步骤如下:

1. 创建一个build-in object对象fn

2. 将fn的内部[[Prototype]]设为Function.prototype
3. 设置内部的[[Call]]属性,它是内部实现的一个方法,处理函数调用的逻辑。(简单的理解为调用函数体)

4. 设置内部的[[Construct]]属性,它是内部实现的一个方法,处理逻辑参考对象创建过程。(简单的理解为创建对象《理解Javascript_06_理解对象的创建过程》一文)

5. 设置fn.length为funArgs.length,如果函数没有参数,则将fn.length设置为0
6. 使用new Object()同样的逻辑创建一个Object对象fnProto
7. 将fnProto.constructor设为fn
8. 将fn.prototype设为fnProto
9. 返回fn

posted @ 2014-10-25 21:06  为猫画眉  阅读(145)  评论(0编辑  收藏  举报